//Ö÷º¯Êý int main(void) { ble_uarts_client_context_t * p_client; blcm_link_ctx_get(m_uarts.p_link_ctx_storage, m_conn_handle, (void *) &p_client); //³õʼ»¯log³ÌÐòÄ£¿é log_init(); //³õʼ»¯´®¿Ú // uart_config(); NRF_LOG_INFO("8\r\n"); //³õʼ»¯APP¶¨Ê±Æ÷ timers_init(); NRF_LOG_INFO("7\r\n"); //³öʹ»½°´¼üºÍָʾµÆ leds_init(); //³õʼ»¯TWI // NRF_LOG_INFO("6\r\n"); twi_master_init(); //Éϵç·þÎñǰÑÓʱ£¬·ñÔòÊý¾Ý¿ÉÄÜ»á³ö´í nrf_delay_ms(2000); // NRF_LOG_INFO("1\r\n"); //³õʼ»¯mpu9250£¬³õʼ»¯¹ý³ÌÖлáÑéÖ¤mpu9250µÄID while(mpu9250_init() == false) { NRF_LOG_INFO("mpu9250 init fail\r\n"); nrf_delay_ms(2000); } NRF_LOG_INFO("2\r\n"); //³õʼ»¯µçÔ´¹ÜÀí power_management_init(); //³õʼ»¯Ð­ÒéÕ» NRF_LOG_INFO("3\r\n"); ble_stack_init(); NRF_LOG_INFO("4\r\n"); //ÅäÖÃGAP²ÎÊý gap_params_init(); //³õʼ»¯GATT gatt_init(); //³õʼ»¯·þÎñ services_init(); //³õʼ»¯¹ã²¥ advertising_init(); //Á¬½Ó²ÎÊýЭÉ̳õʼ»¯ conn_params_init(); NRF_LOG_INFO("BLE Template example started."); //Æô¶¯¹ã²¥ advertising_start(); while (!p_client->is_notification_enabled) { blcm_link_ctx_get(m_uarts.p_link_ctx_storage, m_conn_handle, (void *) &p_client); } //Æô¶¯¶¨Ê±Æ÷ application_timers_start(); //Ö÷Ñ­»· while(true) { //´¦Àí¹ÒÆðµÄLOGºÍÔËÐеçÔ´¹ÜÀí idle_state_handle(); } } 这个mpu9250是通过什么传输方式到nrf模块的

时间: 2025-03-11 09:11:57 浏览: 54
<think>好的,我需要回答用户关于MPU9250与NRF模块之间通信方式的问题,特别是传输接口和初始化函数。首先,我得回忆一下这两种模块的常见接口。 MPU9250通常使用I2C或SPI接口进行通信。大多数情况下,I2C更常见,因为引脚更少,配置相对简单。而NRF24L01模块常用的接口是SPI,因为它需要高速数据传输。所以两者可能都是通过SPI连接到主控,但MPU9250可能使用I2C的情况也存在。 接下来,用户提到代码中的初始化函数。根据用户提供的引用内容,引用了NRF24L01_Init和mpu_dmp_init这两个函数。例如,在引用[1]中,NRF24L01的初始化函数被调用,设置为接收模式。引用[3]提到了mpu_dmp_init()需要持续检测初始化状态。这说明MPU9250可能使用DMP库进行初始化,而NRF模块有自己的初始化函数。 需要确认的是,MPU9250和NRF模块是否直接通信,还是都连接到主控MCU。通常它们都是通过MCU作为中介,所以各自的接口独立。比如MPU9250用I2C,NRF用SPI,两者都需要在主控中初始化对应的接口。 初始化函数方面,MPU9250可能需要I2C的初始化,比如I2C_Init(),以及DMP相关的初始化mpu_dmp_init()。而NRF24L01需要SPI初始化和模块本身的初始化NRF24L01_Init()。此外,可能还需要GPIO初始化来配置片选引脚、中断等。 所以,回答时需要明确两者的接口类型,并列举涉及的初始化函数,包括通信接口初始化和模块本身的初始化函数。同时引用提供的资料,比如引用[1]和[3]中的函数名称,确保符合用户提供的上下文。</think>MPU9250与NRF24L01模块之间的通信方式主要依赖于主控芯片(如STM32)作为中介,两者的通信接口和初始化流程如下: ### 一、MPU9250与NRF24L01的传输接口 1. **MPU9250接口** 通常使用$I^2C$或$SPI$接口与主控芯片通信。其中: - $I^2C$接口需要`SCL`(时钟线)和`SDA`(数据线),适用于低速数据传输 - $SPI$接口需要`SCK`(时钟)、`MISO`(主入从出)、`MOSI`(主出从入)和`CS`(片选),适用于高速数据传输[^3] 2. **NRF24L01接口** 必须使用$SPI$接口(`SCK`, `MISO`, `MOSI`, `CSN`)与主控通信,并需额外配置`CE`(使能引脚)和`IRQ`(中断引脚)用于控制射频状态[^1] ### 二、代码中涉及的初始化函数 #### 1. **MPU9250初始化** - **传感器接口初始化**: 需初始化$I^2C$或$SPI$总线,例如: ```c I2C_Init(); // I2C总线初始化 ``` - **DMP(数字运动处理器)初始化**: 用于传感器数据融合和姿态解算: ```c mpu_dmp_init(); // 初始化DMP,需持续检测直至成功[^3] ``` #### 2. **NRF24L01初始化** - **SPI总线初始化**: 配置SPI通信参数: ```c SPI_Init(); // SPI总线初始化 ``` - **射频模块初始化**: 设置工作模式(发送/接收)和射频参数: ```c NRF24L01_Init(NRF24_MODE_RX); // 初始化为接收模式[^1] ``` #### 3. **辅助模块初始化** - **中断配置**(如NRF24L01的中断响应): ```c INT_Init(); // 中断初始化 ``` - **GPIO配置**: 设置`CE`、`CSN`等控制引脚的工作模式。 --- ### 典型代码流程示例 ```c int main() { // 1. 初始化传感器接口 I2C_Init(); mpu_dmp_init(); // 需循环检测初始化状态 // 2. 初始化无线模块 SPI_Init(); NRF24L01_Init(NRF24_MODE_TX); // 初始化为发送模式 INT_Init(); while (1) { // 读取MPU9250数据并通过NRF24L01发送 uint8_t sensor_data = Read_MPU9250(); NRF24L01_Tx(sensor_data); Delay(1000); } } ``` ---
阅读全文

相关推荐

const int code=4664; char str[200]; #define MQTT_SUBSCRIBE_TOPIC "4664_ctrl" #define MQTT_PUBLIC_TOPIC "4664" char strg[6][12]={0}; void Wifi_Init(void); void Control(void); void Publish(char * msg); void Publish_All(void); int HW_TIME = -1,HW_RESULT = 0; /********** ¿ª»úÆô¶¯ÈÎÎñ ***********/ //ÈÎÎñÓÅÏȼ¶ #define START_TASK_PRIO 1 //ÈÎÎñ¶ÑÕ»´óС #define START_STK_SIZE 128 //ÈÎÎñ¾ä±ú TaskHandle_t StartTask_Handler; //ÈÎÎñº¯Êý void start_task(void *pvParameters); /********** LEDÉÁ˸ÈÎÎñ ***********/ //ÈÎÎñÓÅÏȼ¶ #define LED_TASK_PRIO 10 //ÈÎÎñ¶ÑÕ»´óС #define LED_STK_SIZE 256 //ÈÎÎñ¾ä±ú TaskHandle_t LED_Handler; //ÈÎÎñº¯Êý void LED_task(void *pvParameters); /********** ´®¿Ú2¶ÁÈ¡ÈÎÎñ ***********/ //ÈÎÎñÓÅÏȼ¶ #define UART2READ_TASK_PRIO 2 //ÈÎÎñ¶ÑÕ»´óС #define UART2READ_STK_SIZE 256 //ÈÎÎñ¾ä±ú TaskHandle_t UART2READ_Handler; //ÈÎÎñº¯Êý void UART2READ_task(void *pvParameters); int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é4 È«²¿ÓÃÓÚÇÀÕ¼ÓÅÏȼ¶ delay_init(); //ÑÓʱº¯Êý³õʼ»¯ uart_init(115200); //³õʼ»¯´®¿Ú uart2_init(115200); Control_Init(); //³õʼ»¯¿ØÖÆÄ£¿é OLED_Init(); OLED_Clear(); if(wifi_) //Èç¹û²»ÊÇ´®¿Ú1£¬Ôò³õʼ»¯WIFIÄ£¿é { Wifi_Init(); } Sensors_Init(); //´´½¨¿ªÊ¼ÈÎÎñ xTaskCreate((TaskFunction_t )start_task, //ÈÎÎñº¯Êý (const char* )"start_task", //ÈÎÎñÃû³Æ (uint16_t )START_STK_SIZE, //ÈÎÎñ¶ÑÕ»´óС (void* )NULL, //´«µÝ¸øÈÎÎñº¯ÊýµÄ²ÎÊý (UBaseType_t )START_TASK_PRIO, //ÈÎÎñÓÅÏȼ¶ (TaskHandle_t* )&StartTask_Handler); //ÈÎÎñ¾ä±ú vTaskStartScheduler(); //¿ªÆôÈÎÎñµ÷¶È } //¿ªÊ¼ÈÎÎñÈÎÎñº¯Êý void start_task(void *pvParameters) { taskENTER_CRITICAL(); //½øÈëÁÙ½çÇø xTaskCreate((TaskFunction_t )LED_task, (c

/** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú³õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf * @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ **************************************************************************************************** * @attention * * ʵÑéÆ½Ì¨:ÕýµãÔ­×Ó Ì½Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * ¼¼ÊõÂÛ̳:www.openedv.com * ¹«Ë¾ÍøÖ·:www.alientek.com * ¹ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢²¼ * V1.1 20230605 * ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os ʹÓà */ #endif /******************************************************************************************/ /* ¼ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê¹ÓðëÖ÷»úģʽ */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñʽ£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úģʽ */ #else /* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê¹ÓðëÖ÷»úģʽ */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* ²»Ê¹ÓðëÖ÷»úģʽ£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5ģʽ */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úģʽ */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ½´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */ USART1->DR = (uint8_t)ch; /* ½«Òª·¢Ë͵Ä×Ö·û ch дÈëµ½DR¼Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç¹ûʹÄÜÁ˽ÓÊÕ */ /* ½ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö½Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* ½ÓÊÕ״̬ * bit15£¬ ½ÓÊÕÍê³É±êÖ¾ * bit14£¬ ½ÓÊÕµ½0x0d * bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú½ÓÊÕ»º³å */ UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */ /** * @brief ´®¿ÚX³õʼ»¯º¯Êý * @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô¼ºÐèÒªÉèÖò¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾ­ÉèÖùýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñʽ */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²¼þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê½ */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô½ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖýÓÊÕ»º³åÒÔ¼°½ÓÊÕ»º³å½ÓÊÕ×î´óÊý¾ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×²ã³õʼ»¯º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê³ÉʱÖÓʹÄÜ£¬Òý½ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬½øÐд®¿Ú1 MSP³õʼ»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý½ÅʱÖÓʹÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* ½ÓÊÕÒý½ÅʱÖÓʹÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý½Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯·¢ËÍÒý½Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý½Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯½ÓÊÕÒý½Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* ½ÓÊÕδÍê³É */ { if(g_usart_rx_sta & 0x4000) /* ½ÓÊÕµ½ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* ½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */ } else { g_usart_rx_sta |= 0x8000; /* ½ÓÊÕÍê³ÉÁË */ } } else /* »¹Ã»ÊÕµ½0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* ½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */ #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú³õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf * @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ **************************************************************************************************** * @attention * * ʵÑéÆ½Ì¨:ÕýµãÔ­×Ó Ì½Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * ¼¼ÊõÂÛ̳:www.openedv.com * ¹«Ë¾ÍøÖ·:www.alientek.com * ¹ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢²¼ * V1.1 20230605 * ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os ʹÓà */ #endif /******************************************************************************************/ /* ¼ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê¹ÓðëÖ÷»úģʽ */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñʽ£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úģʽ */ #else /* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê¹ÓðëÖ÷»úģʽ */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* ²»Ê¹ÓðëÖ÷»úģʽ£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5ģʽ */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úģʽ */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ½´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */ USART1->DR = (uint8_t)ch; /* ½«Òª·¢Ë͵Ä×Ö·û ch дÈëµ½DR¼Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç¹ûʹÄÜÁ˽ÓÊÕ */ /* ½ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö½Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* ½ÓÊÕ״̬ * bit15£¬ ½ÓÊÕÍê³É±êÖ¾ * bit14£¬ ½ÓÊÕµ½0x0d * bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú½ÓÊÕ»º³å */ UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */ /** * @brief ´®¿ÚX³õʼ»¯º¯Êý * @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô¼ºÐèÒªÉèÖò¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾ­ÉèÖùýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñʽ */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²¼þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê½ */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô½ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖýÓÊÕ»º³åÒÔ¼°½ÓÊÕ»º³å½ÓÊÕ×î´óÊý¾ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×²ã³õʼ»¯º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê³ÉʱÖÓʹÄÜ£¬Òý½ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬½øÐд®¿Ú1 MSP³õʼ»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý½ÅʱÖÓʹÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* ½ÓÊÕÒý½ÅʱÖÓʹÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý½Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯·¢ËÍÒý½Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý½Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯½ÓÊÕÒý½Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* ½ÓÊÕδÍê³É */ { if(g_usart_rx_sta & 0x4000) /* ½ÓÊÕµ½ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* ½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */ } else { g_usart_rx_sta |= 0x8000; /* ½ÓÊÕÍê³ÉÁË */ } } else /* »¹Ã»ÊÕµ½0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* ½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */ #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú³õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf * @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ **************************************************************************************************** * @attention * * ʵÑéÆ½Ì¨:ÕýµãÔ­×Ó Ì½Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * ¼¼ÊõÂÛ̳:www.openedv.com * ¹«Ë¾ÍøÖ·:www.alientek.com * ¹ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢²¼ * V1.1 20230605 * ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os ʹÓà */ #endif /******************************************************************************************/ /* ¼ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê¹ÓðëÖ÷»úģʽ */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñʽ£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úģʽ */ #else /* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê¹ÓðëÖ÷»úģʽ */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* ²»Ê¹ÓðëÖ÷»úģʽ£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5ģʽ */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úģʽ */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ½´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */ USART1->DR = (uint8_t)ch; /* ½«Òª·¢Ë͵Ä×Ö·û ch дÈëµ½DR¼Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç¹ûʹÄÜÁ˽ÓÊÕ */ /* ½ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö½Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* ½ÓÊÕ״̬ * bit15£¬ ½ÓÊÕÍê³É±êÖ¾ * bit14£¬ ½ÓÊÕµ½0x0d * bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú½ÓÊÕ»º³å */ UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */ /** * @brief ´®¿ÚX³õʼ»¯º¯Êý * @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô¼ºÐèÒªÉèÖò¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾ­ÉèÖùýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñʽ */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²¼þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê½ */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô½ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖýÓÊÕ»º³åÒÔ¼°½ÓÊÕ»º³å½ÓÊÕ×î´óÊý¾ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×²ã³õʼ»¯º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê³ÉʱÖÓʹÄÜ£¬Òý½ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬½øÐд®¿Ú1 MSP³õʼ»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý½ÅʱÖÓʹÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* ½ÓÊÕÒý½ÅʱÖÓʹÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý½Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯·¢ËÍÒý½Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý½Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯½ÓÊÕÒý½Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* ½ÓÊÕδÍê³É */ { if(g_usart_rx_sta & 0x4000) /* ½ÓÊÕµ½ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* ½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */ } else { g_usart_rx_sta |= 0x8000; /* ½ÓÊÕÍê³ÉÁË */ } } else /* »¹Ã»ÊÕµ½0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* ½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */ #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú³õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf * @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ **************************************************************************************************** * @attention * * ʵÑéÆ½Ì¨:ÕýµãÔ­×Ó Ì½Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * ¼¼ÊõÂÛ̳:www.openedv.com * ¹«Ë¾ÍøÖ·:www.alientek.com * ¹ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢²¼ * V1.1 20230605 * ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os ʹÓà */ #endif /******************************************************************************************/ /* ¼ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê¹ÓðëÖ÷»úģʽ */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñʽ£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úģʽ */ #else /* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê¹ÓðëÖ÷»úģʽ */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* ²»Ê¹ÓðëÖ÷»úģʽ£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5ģʽ */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úģʽ */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ½´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */ USART1->DR = (uint8_t)ch; /* ½«Òª·¢Ë͵Ä×Ö·û ch дÈëµ½DR¼Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç¹ûʹÄÜÁ˽ÓÊÕ */ /* ½ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö½Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* ½ÓÊÕ״̬ * bit15£¬ ½ÓÊÕÍê³É±êÖ¾ * bit14£¬ ½ÓÊÕµ½0x0d * bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú½ÓÊÕ»º³å */ UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */ /** * @brief ´®¿ÚX³õʼ»¯º¯Êý * @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô¼ºÐèÒªÉèÖò¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾ­ÉèÖùýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñʽ */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²¼þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê½ */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô½ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖýÓÊÕ»º³åÒÔ¼°½ÓÊÕ»º³å½ÓÊÕ×î´óÊý¾ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×²ã³õʼ»¯º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê³ÉʱÖÓʹÄÜ£¬Òý½ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬½øÐд®¿Ú1 MSP³õʼ»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý½ÅʱÖÓʹÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* ½ÓÊÕÒý½ÅʱÖÓʹÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý½Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯·¢ËÍÒý½Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý½Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯½ÓÊÕÒý½Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* ½ÓÊÕδÍê³É */ { if(g_usart_rx_sta & 0x4000) /* ½ÓÊÕµ½ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* ½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */ } else { g_usart_rx_sta |= 0x8000; /* ½ÓÊÕÍê³ÉÁË */ } } else /* »¹Ã»ÊÕµ½0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* ½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */ #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú³õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf * @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ **************************************************************************************************** * @attention * * ʵÑéÆ½Ì¨:ÕýµãÔ­×Ó Ì½Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * ¼¼ÊõÂÛ̳:www.openedv.com * ¹«Ë¾ÍøÖ·:www.alientek.com * ¹ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢²¼ * V1.1 20230605 * ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os ʹÓà */ #endif /******************************************************************************************/ /* ¼ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê¹ÓðëÖ÷»úģʽ */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñʽ£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úģʽ */ #else /* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê¹ÓðëÖ÷»úģʽ */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* ²»Ê¹ÓðëÖ÷»úģʽ£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5ģʽ */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úģʽ */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ½´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */ USART1->DR = (uint8_t)ch; /* ½«Òª·¢Ë͵Ä×Ö·û ch дÈëµ½DR¼Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç¹ûʹÄÜÁ˽ÓÊÕ */ /* ½ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö½Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* ½ÓÊÕ״̬ * bit15£¬ ½ÓÊÕÍê³É±êÖ¾ * bit14£¬ ½ÓÊÕµ½0x0d * bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú½ÓÊÕ»º³å */ UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */ /** * @brief ´®¿ÚX³õʼ»¯º¯Êý * @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô¼ºÐèÒªÉèÖò¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾ­ÉèÖùýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñʽ */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²¼þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê½ */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô½ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖýÓÊÕ»º³åÒÔ¼°½ÓÊÕ»º³å½ÓÊÕ×î´óÊý¾ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×²ã³õʼ»¯º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê³ÉʱÖÓʹÄÜ£¬Òý½ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬½øÐд®¿Ú1 MSP³õʼ»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý½ÅʱÖÓʹÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* ½ÓÊÕÒý½ÅʱÖÓʹÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý½Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯·¢ËÍÒý½Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý½Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯½ÓÊÕÒý½Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* ½ÓÊÕδÍê³É */ { if(g_usart_rx_sta & 0x4000) /* ½ÓÊÕµ½ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* ½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */ } else { g_usart_rx_sta |= 0x8000; /* ½ÓÊÕÍê³ÉÁË */ } } else /* »¹Ã»ÊÕµ½0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* ½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */ #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú³õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf * @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ **************************************************************************************************** * @attention * * ʵÑéÆ½Ì¨:ÕýµãÔ­×Ó Ì½Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * ¼¼ÊõÂÛ̳:www.openedv.com * ¹«Ë¾ÍøÖ·:www.alientek.com * ¹ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢²¼ * V1.1 20230605 * ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os ʹÓà */ #endif /******************************************************************************************/ /* ¼ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê¹ÓðëÖ÷»úģʽ */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñʽ£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úģʽ */ #else /* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê¹ÓðëÖ÷»úģʽ */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* ²»Ê¹ÓðëÖ÷»úģʽ£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5ģʽ */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úģʽ */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ½´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */ USART1->DR = (uint8_t)ch; /* ½«Òª·¢Ë͵Ä×Ö·û ch дÈëµ½DR¼Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç¹ûʹÄÜÁ˽ÓÊÕ */ /* ½ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö½Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* ½ÓÊÕ״̬ * bit15£¬ ½ÓÊÕÍê³É±êÖ¾ * bit14£¬ ½ÓÊÕµ½0x0d * bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú½ÓÊÕ»º³å */ UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */ /** * @brief ´®¿ÚX³õʼ»¯º¯Êý * @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô¼ºÐèÒªÉèÖò¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾ­ÉèÖùýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñʽ */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²¼þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê½ */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô½ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖýÓÊÕ»º³åÒÔ¼°½ÓÊÕ»º³å½ÓÊÕ×î´óÊý¾ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×²ã³õʼ»¯º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê³ÉʱÖÓʹÄÜ£¬Òý½ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬½øÐд®¿Ú1 MSP³õʼ»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý½ÅʱÖÓʹÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* ½ÓÊÕÒý½ÅʱÖÓʹÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý½Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯·¢ËÍÒý½Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý½Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯½ÓÊÕÒý½Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* ½ÓÊÕδÍê³É */ { if(g_usart_rx_sta & 0x4000) /* ½ÓÊÕµ½ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* ½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */ } else { g_usart_rx_sta |= 0x8000; /* ½ÓÊÕÍê³ÉÁË */ } } else /* »¹Ã»ÊÕµ½0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* ½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */ #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntExit(); #endif } #endif (我要使输入的在LCD上面显示应该怎么做)

#include "time.h" #include "led.h" /******************************************************************************* * º¯ Êý Ãû : TIM4_Init * º¯Êý¹¦ÄÜ : TIM4³õʼ»¯º¯Êý * Êä Èë : per:ÖØ×°ÔØÖµ psc:·ÖƵϵÊý * Êä ³ö : ÎÞ *******************************************************************************/ void TIM4_Init(u16 per,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//ʹÄÜTIM4ʱÖÓ TIM_TimeBaseInitStructure.TIM_Period=per; //×Ô¶¯×°ÔØÖµ TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //·ÖƵϵÊý TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÉèÖÃÏòÉϼÆÊýģʽ TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure); TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //¿ªÆô¶¨Ê±Æ÷ÖÐ¶Ï TIM_ClearITPendingBit(TIM4,TIM_IT_Update); NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;//¶¨Ê±Æ÷ÖжÏͨµÀ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//ÇÀÕ¼ÓÅÏȼ¶ NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //×ÓÓÅÏȼ¶ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM4,ENABLE); //ʹÄܶ¨Ê±Æ÷ } /******************************************************************************* * º¯ Êý Ãû : TIM4_IRQHandler * º¯Êý¹¦ÄÜ : TIM4ÖжϺ¯Êý * Êä Èë : ÎÞ * Êä ³ö : ÎÞ *******************************************************************************/ void TIM4_IRQHandler(void) { if(TIM_GetITStatus(TIM4,TIM_IT_Update)) { LED2=!LED2; } TIM_ClearITPendingBit(TIM4,TIM_IT_Update); } 在这个代码上添加定时器3的中断,蜂鸣器代码如下void BEEP_Init(void) //¶Ë¿Ú³õʼ»¯ { GPIO_InitTypeDef GPIO_InitStructure; //ÉùÃ÷Ò»¸ö½á¹¹Ìå±äÁ¿£¬ÓÃÀ´³õʼ»¯GPIO RCC_APB2PeriphClockCmd(BEEP_PORT_RCC,ENABLE); /* ¿ªÆôGPIOʱÖÓ */ /* ÅäÖÃGPIOµÄģʽºÍIO¿Ú */ GPIO_InitStructure.GPIO_Pin=BEEP_PIN; //Ñ¡ÔñÄãÒªÉèÖõÄIO¿Ú G

/*** ************************************************************************************************ * @version V1.0 * @author ¹С°à¿Æ¼¼ * @brief SCCB ½Ó¿ÚÏà¹Øº¯Êý£¨Èí¼þÄ£ÄâIICµÄÐÎʽ£© ************************************************************************************************* * @description * * ʵÑéÆ½Ì¨£ºÂ¹Ð¡°àSTM32H723ZGT6ºËÐÄ°å £¨ÐͺţºLXB723ZG-P1£© * ¿Í·þ΢ÐÅ£º19949278543 * >>>>> Îļþ˵Ã÷£º * * 1.SCCBÏà¹Øº¯Êý£¨SCCBºÍIICÒ»Ñù£© * 2.ʹÓÃÄ£Äâ½Ó¿ÚµÄÐÎʽ * 3.ͨÐÅËÙ¶ÈĬÈÏΪ 300KHz ×óÓÒ£¬×î´ó²»Äܳ¬¹ý400K * ************************************************************************************************************************ ***/ #include "sccb.h" /***************************************************************************************** * º¯ Êý Ãû: SCCB_GPIO_Config * Èë¿Ú²ÎÊý: ÎÞ * ·µ »Ø Öµ: ÎÞ * º¯Êý¹¦ÄÜ: ³õʼ»¯IICµÄGPIO¿Ú,ÍÆÍìÊä³ö * ˵ Ã÷: ÓÉÓÚIICͨÐÅËٶȲ»¸ß£¬ÕâÀïµÄIO¿ÚËÙ¶ÈÅäÖÃΪ2M¼´¿É ******************************************************************************************/ void SCCB_GPIO_Config (void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; SCCB_SCL_CLK_ENABLE; //³õʼ»¯IO¿ÚʱÖÓ SCCB_SDA_CLK_ENABLE; GPIO_InitStruct.Pin = SCCB_SCL_PIN; // SCLÒý½Å GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; // ¿ªÂ©Êä³ö GPIO_InitStruct.Pull = GPIO_NOPULL; // ²»´øÉÏÏÂÀ­ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Ëٶȵȼ¶ HAL_GPIO_Init(SCCB_SCL_PORT, &GPIO_InitStruct); GPIO_InitStruct.Pin = SCCB_SDA_PIN; // SDAÒý½Å HAL_GPIO_Init(SCCB_SDA_PORT, &GPIO_InitStruct); GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // ÍÆÍìÊä³ö GPIO_InitStruct.Pull = GPIO_PULLUP; // ÉÏÀ­ HAL_GPIO_WritePin(SCCB_SCL_PORT, SCCB_SCL_PIN, GPIO_PIN_SET); // SCLÊä³ö¸ßµçƽ HAL_GPIO_WritePin(SCCB_SDA_PORT, SCCB_SDA_PIN, GPIO_PIN_SET); // SDAÊä³ö¸ßµçƽ } /***************************************************************************************** * º¯ Êý Ãû: SCCB_Delay * Èë¿Ú²ÎÊý: a - ÑÓʱʱ¼ä * ·µ »Ø Öµ: ÎÞ * º¯Êý¹¦ÄÜ: ¼òµ¥ÑÓʱº¯Êý * ˵ Ã÷: ΪÁËÒÆÖ²µÄ¼ò±ãÐÔÇÒ¶ÔÑÓʱ¾«¶ÈÒªÇ󲻸ߣ¬ËùÒÔ²»ÐèҪʹÓö¨Ê±Æ÷×öÑÓʱ ******************************************************************************************/ void SCCB_Delay(uint32_t a) { volatile uint16_t i; while (a --) { for (i = 0; i < 3; i++); } } /***************************************************************************************** * º¯ Êý Ãû: SCCB_Start * Èë¿Ú²ÎÊý: ÎÞ * ·µ »Ø Öµ: ÎÞ * º¯Êý¹¦ÄÜ: IICÆðʼÐźŠ* ˵ Ã÷: ÔÚSCL´¦ÓÚ¸ßµçÆ½ÆÚ¼ä£¬SDAÓɸߵ½µÍÌø±äΪÆðʼÐźŠ******************************************************************************************/ void SCCB_Start(void) { SCCB_SDA(1); SCCB_SCL(1); SCCB_Delay(SCCB_DelayVaule); SCCB_SDA(0); SCCB_Delay(SCCB_DelayVaule); SCCB_SCL(0); SCCB_Delay(SCCB_DelayVaule); } /***************************************************************************************** * º¯ Êý Ãû: SCCB_Stop * Èë¿Ú²ÎÊý: ÎÞ * ·µ »Ø Öµ: ÎÞ * º¯Êý¹¦ÄÜ: IICÍ£Ö¹ÐźŠ* ˵ Ã÷: ÔÚSCL´¦ÓÚ¸ßµçÆ½ÆÚ¼ä£¬SDAÓɵ͵½¸ßÌø±äΪÆðʼÐźŠ******************************************************************************************/ void SCCB_Stop(void) { SCCB_SCL(0); SCCB_Delay(SCCB_DelayVaule); SCCB_SDA(0); SCCB_Delay(SCCB_DelayVaule); SCCB_SCL(1); SCCB_Delay(SCCB_DelayVaule); SCCB_SDA(1); SCCB_Delay(SCCB_DelayVaule); } /***************************************************************************************** * º¯ Êý Ãû: SCCB_ACK * Èë¿Ú²ÎÊý: ÎÞ * ·µ »Ø Öµ: ÎÞ * º¯Êý¹¦ÄÜ: IICÓ¦´ðÐźŠ* ˵ Ã÷: ÔÚSCLΪ¸ßµçƽÆÚ¼ä£¬SDAÒý½ÅÊä³öΪµÍµçƽ£¬²úÉúÓ¦´ðÐźŠ******************************************************************************************/ void SCCB_ACK(void) { SCCB_SCL(0); SCCB_Delay(SCCB_DelayVaule); SCCB_SDA(0); SCCB_Delay(SCCB_DelayVaule); SCCB_SCL(1); SCCB_Delay(SCCB_DelayVaule); SCCB_SCL(0); // SCLÊä³öµÍʱ£¬SDAÓ¦Á¢¼´À­¸ß£¬ÊÍ·Å×ÜÏß SCCB_SDA(1); SCCB_Delay(SCCB_DelayVaule); } /***************************************************************************************** * º¯ Êý Ãû: SCCB_NoACK * Èë¿Ú²ÎÊý: ÎÞ * ·µ »Ø Öµ: ÎÞ * º¯Êý¹¦ÄÜ: IIC·ÇÓ¦´ðÐźŠ* ˵ Ã÷: ÔÚSCLΪ¸ßµçƽÆÚ¼ä£¬ÈôSDAÒý½ÅΪ¸ßµçƽ£¬²úÉú·ÇÓ¦´ðÐźŠ******************************************************************************************/ void SCCB_NoACK(void) { SCCB_SCL(0); SCCB_Delay(SCCB_DelayVaule); SCCB_SDA(1); SCCB_Delay(SCCB_DelayVaule); SCCB_SCL(1); SCCB_Delay(SCCB_DelayVaule); SCCB_SCL(0); SCCB_Delay(SCCB_DelayVaule); } /***************************************************************************************** * º¯ Êý Ãû: SCCB_WaitACK * Èë¿Ú²ÎÊý: ÎÞ * ·µ »Ø Öµ: ÎÞ * º¯Êý¹¦ÄÜ: µÈ´ý½ÓÊÕÉ豸·¢³öÓ¦´ðÐźŠ* ˵ Ã÷: ÔÚSCLΪ¸ßµçƽÆÚ¼ä£¬Èô¼ì²âµ½SDAÒý½ÅΪµÍµçƽ£¬Ôò½ÓÊÕÉ豸ÏìÓ¦Õý³£ ******************************************************************************************/ uint8_t SCCB_WaitACK(void) { SCCB_SDA(1); SCCB_Delay(SCCB_DelayVaule); SCCB_SCL(1); SCCB_Delay(SCCB_DelayVaule); if( HAL_GPIO_ReadPin(SCCB_SDA_PORT,SCCB_SDA_PIN) != 0) //ÅжÏÉ豸ÊÇ·ñÓÐ×ö³öÏìÓ¦ { SCCB_SCL(0); SCCB_Delay( SCCB_DelayVaule ); return ACK_ERR; //ÎÞÓ¦´ð } else { SCCB_SCL(0); SCCB_Delay( SCCB_DelayVaule ); return ACK_OK; //Ó¦´ðÕý³£ } } /***************************************************************************************** * º¯ Êý Ãû: SCCB_WriteByte * Èë¿Ú²ÎÊý: IIC_Data - ҪдÈëµÄ8λÊý¾Ý * ·µ »Ø Öµ: ACK_OK - É豸ÏìÓ¦Õý³£ * ACK_ERR - É豸ÏìÓ¦´íÎó * º¯Êý¹¦ÄÜ: дһ×Ö½ÚÊý¾Ý * ˵ Ã÷: ¸ßλÔÚǰ ******************************************************************************************/ uint8_t SCCB_WriteByte(uint8_t IIC_Data) { uint8_t i; for (i = 0; i < 8; i++) { SCCB_SDA(IIC_Data & 0x80); SCCB_Delay( SCCB_DelayVaule ); SCCB_SCL(1); SCCB_Delay( SCCB_DelayVaule ); SCCB_SCL(0); if(i == 7) { SCCB_SDA(1); } IIC_Data <<= 1; } return SCCB_WaitACK(); //µÈ´ýÉ豸ÏìÓ¦ } /***************************************************************************************** * º¯ Êý Ãû: SCCB_ReadByte * Èë¿Ú²ÎÊý: ACK_Mode - ÏìӦģʽ£¬ÊäÈë1Ôò·¢³öÓ¦´ðÐźţ¬ÊäÈë0·¢³ö·ÇÓ¦´ðÐźŠ* ·µ »Ø Öµ: ACK_OK - É豸ÏìÓ¦Õý³£ * ACK_ERR - É豸ÏìÓ¦´íÎó * º¯Êý¹¦ÄÜ: ¶ÁÒ»×Ö½ÚÊý¾Ý * ˵ Ã÷: 1.¸ßλÔÚǰ * 2.Ó¦ÔÚÖ÷»ú½ÓÊÕ×îºóÒ»×Ö½ÚÊý¾Ýʱ·¢ËÍ·ÇÓ¦´ðÐźŠ******************************************************************************************/ uint8_t SCCB_ReadByte(uint8_t ACK_Mode) { uint8_t IIC_Data = 0; uint8_t i = 0; for (i = 0; i < 8; i++) { IIC_Data <<= 1; SCCB_SCL(1); SCCB_Delay( SCCB_DelayVaule ); IIC_Data |= (HAL_GPIO_ReadPin(SCCB_SDA_PORT,SCCB_SDA_PIN) & 0x01); SCCB_SCL(0); SCCB_Delay( SCCB_DelayVaule ); } if ( ACK_Mode == 1 ) // Ó¦´ðÐźŠSCCB_ACK(); else SCCB_NoACK(); // ·ÇÓ¦´ðÐźŠreturn IIC_Data; } /************************************************************************************************************************************* * º¯ Êý Ãû: SCCB_WriteHandle * * Èë¿Ú²ÎÊý: addr - Òª½øÐвÙ×÷µÄ¼Ä´æÆ÷(8λµØÖ·) * * ·µ »Ø Öµ: SUCCESS - ²Ù×÷³É¹¦£¬ERROR - ²Ù×÷ʧ°Ü * * º¯Êý¹¦ÄÜ: ¶ÔÖ¸¶¨µÄ¼Ä´æÆ÷(8λµØÖ·)Ö´ÐÐд²Ù×÷£¬OV2640Óõ½ ************************************************************************************************************************************/ uint8_t SCCB_WriteHandle (uint8_t addr) { uint8_t status; // ״̬±ê־λ SCCB_Start(); // Æô¶¯IICͨÐÅ if( SCCB_WriteByte(OV2640_DEVICE_ADDRESS) == ACK_OK ) //дÊý¾ÝÖ¸Áî { if( SCCB_WriteByte((uint8_t)(addr)) != ACK_OK ) { status = ERROR; // ²Ù×÷ʧ°Ü } } status = SUCCESS; // ²Ù×÷³É¹¦ return status; } /************************************************************************************************************************************* * º¯ Êý Ãû: SCCB_WriteReg * * Èë¿Ú²ÎÊý: addr - ҪдÈëµÄ¼Ä´æÆ÷(8λµØÖ·)£¬value - ҪдÈëµÄÊý¾Ý * * ·µ »Ø Öµ: SUCCESS - ²Ù×÷³É¹¦£¬ ERROR - ²Ù×÷ʧ°Ü * * º¯Êý¹¦ÄÜ: ¶ÔÖ¸¶¨µÄ¼Ä´æÆ÷(8λµØÖ·)дһ×Ö½ÚÊý¾Ý£¬OV2640Óõ½ ************************************************************************************************************************************/ uint8_t SCCB_WriteReg (uint8_t addr,uint8_t value) { uint8_t status; SCCB_Start(); //Æô¶¯IICͨѶ if( SCCB_WriteHandle(addr) == SUCCESS) //дÈëÒª²Ù×÷µÄ¼Ä´æÆ÷ { if (SCCB_WriteByte(value) != ACK_OK) //дÊý¾Ý { status = ERROR; } } SCCB_Stop(); // ֹͣͨѶ status = SUCCESS; // дÈë³É¹¦ return status; } /************************************************************************************************************************************* * º¯ Êý Ãû: SCCB_ReadReg * * Èë¿Ú²ÎÊý: addr - Òª¶ÁÈ¡µÄ¼Ä´æÆ÷(8λµØÖ·) * * ·µ »Ø Öµ: ¶Áµ½µÄÊý¾Ý * * º¯Êý¹¦ÄÜ: ¶ÔÖ¸¶¨µÄ¼Ä´æÆ÷(8λµØÖ·)¶Áȡһ×Ö½ÚÊý¾Ý£¬OV2640Óõ½ ************************************************************************************************************************************/ uint8_t SCCB_ReadReg (uint8_t addr) { uint8_t value = 0; SCCB_Start(); // Æô¶¯IICͨÐÅ if( SCCB_WriteHandle(addr) == SUCCESS) //дÈëÒª²Ù×÷µÄ¼Ä´æÆ÷ { SCCB_Stop(); // Í£Ö¹IICͨÐÅ SCCB_Start(); //ÖØÐÂÆô¶¯IICͨѶ if (SCCB_WriteByte(OV2640_DEVICE_ADDRESS|0X01) == ACK_OK) // ·¢ËͶÁÃüÁî { value = SCCB_ReadByte(0); // ¶Áµ½×îºóÒ»¸öÊý¾Ýʱ·¢ËÍ ·ÇÓ¦´ðÐźŠ} SCCB_Stop(); // Í£Ö¹IICͨÐÅ } return value; } /************************************************************************************************************************************* * º¯ Êý Ãû: SCCB_WriteHandle_16Bit * * Èë¿Ú²ÎÊý: addr - Òª½øÐвÙ×÷µÄ¼Ä´æÆ÷(16λµØÖ·) * * ·µ »Ø Öµ: SUCCESS - ²Ù×÷³É¹¦£¬ERROR - ²Ù×÷ʧ°Ü * * º¯Êý¹¦ÄÜ: ¶ÔÖ¸¶¨µÄ¼Ä´æÆ÷(16λµØÖ·)Ö´ÐÐд²Ù×÷£¬OV5640Óõ½ ************************************************************************************************************************************/ uint8_t SCCB_WriteHandle_16Bit (uint16_t addr) { uint8_t status; // ״̬±ê־λ SCCB_Start(); // Æô¶¯IICͨÐÅ if( SCCB_WriteByte(OV5640_DEVICE_ADDRESS) == ACK_OK ) //дÊý¾ÝÖ¸Áî { if( SCCB_WriteByte((uint8_t)(addr >> 8)) == ACK_OK ) //дÈë16λµØÖ· { if( SCCB_WriteByte((uint8_t)(addr)) != ACK_OK ) { status = ERROR; // ²Ù×÷ʧ°Ü } } } status = SUCCESS; // ²Ù×÷³É¹¦ return status; } /************************************************************************************************************************************* * º¯ Êý Ãû: SCCB_WriteReg_16Bit * * Èë¿Ú²ÎÊý: addr - ҪдÈëµÄ¼Ä´æÆ÷(16λµØÖ·) value - ҪдÈëµÄÊý¾Ý * * ·µ »Ø Öµ: SUCCESS - ²Ù×÷³É¹¦£¬ERROR - ²Ù×÷ʧ°Ü * * º¯Êý¹¦ÄÜ: ¶ÔÖ¸¶¨µÄ¼Ä´æÆ÷(16λµØÖ·)дһ×Ö½ÚÊý¾Ý£¬OV5640Óõ½ ************************************************************************************************************************************/ uint8_t SCCB_WriteReg_16Bit(uint16_t addr,uint8_t value) { uint8_t status; SCCB_Start(); //Æô¶¯IICͨѶ if( SCCB_WriteHandle_16Bit(addr) == SUCCESS) //дÈëÒª²Ù×÷µÄ¼Ä´æÆ÷ { if (SCCB_WriteByte(value) != ACK_OK) //дÊý¾Ý { status = ERROR; } } SCCB_Stop(); // ֹͣͨѶ status = SUCCESS; // дÈë³É¹¦ return status; } /************************************************************************************************************************************* * º¯ Êý Ãû: SCCB_ReadReg_16Bit * * Èë¿Ú²ÎÊý: addr - Òª¶ÁÈ¡µÄ¼Ä´æÆ÷(16λµØÖ·) * * ·µ »Ø Öµ: ¶Áµ½µÄÊý¾Ý * * º¯Êý¹¦ÄÜ: ¶ÔÖ¸¶¨µÄ¼Ä´æÆ÷(16λµØÖ·)¶Áȡһ×Ö½ÚÊý¾Ý£¬OV5640Óõ½ ************************************************************************************************************************************/ uint8_t SCCB_ReadReg_16Bit (uint16_t addr) { uint8_t value = 0; SCCB_Start(); // Æô¶¯IICͨÐÅ if( SCCB_WriteHandle_16Bit(addr) == SUCCESS) //дÈëÒª²Ù×÷µÄ¼Ä´æÆ÷ { SCCB_Stop(); // Í£Ö¹IICͨÐÅ SCCB_Start(); //ÖØÐÂÆô¶¯IICͨѶ if (SCCB_WriteByte(OV5640_DEVICE_ADDRESS|0X01) == ACK_OK) // ·¢ËͶÁÃüÁî { value = SCCB_ReadByte(0); // ¶Áµ½×îºóÒ»¸öÊý¾Ýʱ·¢ËÍ ·ÇÓ¦´ðÐźŠ} SCCB_Stop(); // Í£Ö¹IICͨÐÅ } return value; } /************************************************************************************************************************************* * º¯ Êý Ãû: SCCB_WriteBuffer_16Bit * * Èë¿Ú²ÎÊý: addr - ҪдÈëµÄ¼Ä´æÆ÷(16λµØÖ·) *pData - Êý¾ÝÇø size - Òª´«ÊäÊý¾ÝµÄ´óС * * ·µ »Ø Öµ: SUCCESS - ²Ù×÷³É¹¦£¬ERROR - ²Ù×÷ʧ°Ü * * º¯Êý¹¦ÄÜ: ¶ÔÖ¸¶¨µÄ¼Ä´æÆ÷(16λµØÖ·)ÅúÁ¿Ð´Êý¾Ý£¬OV5640 дÈë×Ô¶¯¶Ô½¹¹Ì¼þʱÓõ½ ************************************************************************************************************************************/ uint8_t SCCB_WriteBuffer_16Bit(uint16_t addr,uint8_t *pData, uint32_t size) { uint8_t status; uint32_t i; SCCB_Start(); //Æô¶¯IICͨѶ if( SCCB_WriteHandle_16Bit(addr) == SUCCESS) //дÈëÒª²Ù×÷µÄ¼Ä´æÆ÷ { for(i=0;i<size;i++) { SCCB_WriteByte(*pData);//дÊý¾Ý pData++; } } SCCB_Stop(); // ֹͣͨѶ status = SUCCESS; // дÈë³É¹¦ return status; } /********************************************************************************************/ 分析代码作用

检查以下代码能否生成hex文件:#include"reg52.h" #include"intrins.h" #include"LCD1602.h" //************************************ #define uint unsigned int #define uchar unsigned char #define Nack_counter 10 unsigned char code str[]; //************** ¶Ë¿Ú¶¨Òå************** //LCD ¿ØÖÆÏß½Ó¿Ú uchar flag1; sbit RS=P3^5; sbit RW=P3^3; sbit LCDE=P3^4; //mlx90614 ¶Ë¿Ú¶¨Òå sbit SCL=P3^0;// ʱÖÓÏß sbit SDA=P3^1;// Êý¾ÝÏß //************ Êý¾Ý¶¨Òå**************** bdata uchar flag;//¿ÉλѰַÊý¾Ý sbit bit_out=flag^7; sbit bit_in=flag^0; uchar DataH,DataL,Pecreg; //************ º¯ÊýÉùÃ÷***************************************** void start_bit(); //MLX90614 ·¢Æðʼλ×Ó³ÌÐò void stop_bit(); //MLX90614·¢½áÊøÎ»×Ó³ÌÐò uchar rx_byte(void); //MLX90614 ½ÓÊÕ×Ö½Ú×Ó³ÌÐò void send_bit(void); //MLX90614·¢ËÍλ×Ó³ÌÐò void tx_byte(uchar dat_byte); //MLX90614 ½ÓÊÕ×Ö½Ú×Ó³ÌÐò void receive_bit(void); //MLX90614½ÓÊÕλ×Ó³ÌÐò void delay(uint N); //ÑÓʱ³ÌÐò uint memread(void); // ¶ÁζÈÊý¾Ý void init1602(void); //LCD ³õʼ»¯×Ó³ÌÐò void chk_busy_flg(void); //LCD ÅжÏæ×Ó³ÌÐò void dis_cmd_wrt(uchar cmd); //LCD дÃüÁî×Ó³ÌÐò void dis_dat_wrt(uchar dat); //LCD дÊý¾Ý×Ó³ÌÐò void display(uint Tem); // ÏÔʾ×Ó³ÌÐò void Delay10ms() //@11.0592MHz { unsigned char i, j; i = 18; j = 235; do { while (--j); } while (--i); } void Delay1000ms() //@11.0592MHz { unsigned char i, j, k; _nop_(); i = 8; j = 1; k = 243; do { do { while (--k); } while (--j); } while (--i); } //*************Ö÷º¯Êý******************************************* void main() { uint Tem; //º¯Êý²¿·Ö SCL=1;SDA=1;_nop_(); _nop_();_nop_();_nop_(); SCL=0; Delay1000ms(); SCL=1; LCD_Init(); LCD_ShowString(1,1,"Temperature:"); while(1) { Tem=memread(); display(Tem); Delay10ms(); LCD_WriteCom

#include "ds1302.h" #include<reg52.h> #include<intrins.h> uchar time_data[7]={20,22,2,28,13,48,30};//ÄêÖÜÔÂÈÕʱ·ÖÃë //³õʼ»¯Ê±ÖÓоƬds1302Êý×é //uchar time_data[7]={0,0,0,0,0,0,0};//ÄêÖÜÔÂÈÕʱ·ÖÃë //³õʼ»¯Ê±ÖÓоƬds1302Êý×é uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; //дµÄ¡°ÄêÖÜÔÂÈÕʱ·ÖÃ롱¼Ä´æÆ÷µØÖ· uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; //¶ÁµÄ¡°ÄêÖÜÔÂÈÕʱ·ÖÃ롱¼Ä´æÆ÷µØÖ· void write_ds1302_byte(uchar date);//µ¥×Ö½ÚдÈ뺯Êý void write_ds1302(uchar add,uchar date);//Ë«×Ö½ÚдÈ뺯Êý ÏÈдµØÖ·ÔÙдÊý¾Ý uchar read_ds1302(uchar add); //¶Á³öº¯Êý void set_rtc();//ʱÖÓоƬds1302³õʼ»¯º¯Êý void read_rtc();//¶Á³öʱÖÓоƬds1302µÄʱ¼äÊý¾Ý void write_ds1302_byte(uchar date)//µ¥×Ö½ÚдÈ뺯Êý { uchar i; for(i=0;i<8;i++)//Êý¾ÝÊÇÓɵØÎ»¿ªÊ¼¶Á { scl=0; io=date&0x01; date=date>>1; scl=1; } } void write_ds1302(uchar add,uchar date)//Ë«×Ö½ÚдÈ뺯Êý ÏÈдµØÖ·ÔÙдÊý¾Ý { rst=0; _nop_(); scl=0; _nop_(); rst=1; _nop_(); write_ds1302_byte(add); write_ds1302_byte(date); rst=0; _nop_(); io=1; scl=1; } uchar read_ds1302(uchar add)//¶Á³öº¯Êý { uchar i,val; rst=0; _nop_(); scl=0; _nop_(); rst=1; _nop_(); write_ds1302_byte(add); for(i=0;i<8;i++)//Êý¾ÝÓɵÍλ¿ªÊ¼¶ÁÈ¡ { val=val>>1; scl=0; if(io) val=val|0x80;// ²»ÄÜÓÃval=(val>>1)|io;ÒòΪval=(val>>1)|ioÊǽ«valµÄ¸ßλÓëio»ò scl=1; } rst=0; _nop_(); scl=0; _nop_(); scl=1; io=1; return(val); } void set_rtc()//ʱÖÓоƬds1302³õʼ»¯º¯Êý { uchar i,j; for(i=0;i<7;i++)//ת»¯ÎªÊ®ÁùÖÆ { j=time_data[i]/10; time_data[i]=time_data[i]%10; time_data[i]=time_data[i]+j*16; } write_ds1302(0x8e,0x00);//È¥³ýд±£»¤ for(i=0;i<7;i++) { write_ds1302(write_add[i],time_data[i]); } write_ds1302(0x8e,0x80);//¼Óд±£»¤ } void read_rtc()//¶Á³öʱÖÓоƬds1302µÄʱ¼äÊý¾Ý { uchar i; for(i=0;i<7;i++) { time_data[i]=read_ds1302(read_add[i]); time_data[i]=(time_data[i]/16)*10+(time_data[i]%16); } }

/************************************************************************ ¹¦ÄÜÃèÊö: ¶¨Ê±Æ÷0ÿ¸ô1s¶Ô¼ÆÊýÖµ¼Ó1 ,ÊýÂë¹ÜÏÔʾ¼ÆÊýÖµ ʵÑéÏä½ÓÏß P00..P07 --- SA..SH P20..P23 --- C0..C3 *************************************************************************/ #include <STC15W4K.h> #include <intrins.h> #define uchar unsigned char //Êý¾ÝÀàÐͺ궨Òå #define uint unsigned int /**********µ¥Æ¬»úIO¿ÚÒý½Å¶¨Òå********************************************/ #define out P0 //IO¶Ë¿Ú¶¨Òå /**********È«¾Ö±äÁ¿¶¨Òå***************************************************/ #define FOSC 11059200L //#define TMS (65536-FOSC/1000) //1Tģʽ 1MS #define TMS (65536-FOSC/12/1000) //12Tģʽ 1MS unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff}; // 0, 1, 2, 3£¬ 4, 5, 6, 7, 8, 9, off uint i = 0; //È«¾Ö±äÁ¿ uint cnt=0; int mode, int0_cnt=0; /**********º¯Êý¶¨Òå******************************************************/ /***********ÑÓʱº¯Êý*****************************************************/ void delay_us(unsigned int us) // 1usÑÓʱº¯Êý { while(--us) ; } void delay_ms(unsigned int ms) // 1msÑÓʱº¯Êý { unsigned int i; for(;ms>0;ms--) for(i=850;i>0;i--); } /***********Ö÷º¯Êý*******************************************************/ void main(void) { int j,num; P0M1=0; P0M0=0; P1M1=0; P1M0=0; P2M1=0; P2M0=0; P4M1=0; P4M0=0; P3M1=0; P3M0=0; P6M1=0; P6M0=0; P7M1=0; P7M0=0; AUXR &= 0x7f; //¶¨Ê±Æ÷0Ϊ12Tģʽ // AUXR |= 0x80; //¶¨Ê±Æ÷0Ϊ1Tģʽ TMOD |= 0x00; //ÉèÖö¨Ê±Æ÷Ϊģʽ0(16λ×Ô¶¯ÖØ×°ÔØ) TL0 = TMS; //³õʼ»¯¼ÆÊ±Öµ TH0 = TMS >> 8; TR0 = 1; //¶¨Ê±Æ÷0¿ªÊ¼¼ÆÊ± ET0 = 1; //ʹÄܶ¨Ê±Æ÷0ÖÐ¶Ï EA = 1; IT0 = 1;

#include "beepkey.h" #include "delay.h" /************************************************************************** * º¯ Êý Ãû : delay * º¯Êý¹¦ÄÜ : ¼òÒ×ÑÓʱº¯Êý * Êä Èë : ÎÞ * Êä ³ö : ÎÞ **************************************************************************/ void delay(u32 i) { while(i++) ; } /************************************************************************* * º¯ Êý Ãû : BeepInit * º¯Êý¹¦ÄÜ : ·äÃùÆ÷¶Ë¿Ú³õʼ»¯º¯Êý ͨ¹ý¸Ä±äƵÂÊ¿ØÖÆÉùÒô±ä»¯ * Êä Èë : ÎÞ * Êä ³ö : ÎÞ **************************************************************************/ void BeepInit() //¶Ë¿Ú³õʼ»¯ { GPIO_InitTypeDef GPIO_InitStructure; //ÉùÃ÷Ò»¸ö½á¹¹Ìå±äÁ¿£¬ÓÃÀ´³õʼ»¯GPIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); /* ¿ªÆôGPIOʱÖÓ */ /* ÅäÖÃGPIOµÄģʽºÍIO¿Ú */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; //Ñ¡ÔñÄãÒªÉèÖõÄIO¿Ú GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //ÉèÖÃÍÆÍìÊä³öģʽ GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //ÉèÖô«ÊäËÙÂÊ GPIO_Init(GPIOC,&GPIO_InitStructure); /* ³õʼ»¯GPIO */ } /************************************************************************ * º¯ Êý Ãû : KeyInit * º¯Êý¹¦ÄÜ : °´¼ü¶Ë¿Ú³õʼ»¯º¯Êý ͨ¹ý¸Ä±äƵÂÊ¿ØÖÆÉùÒô±ä»¯ * Êä Èë : ÎÞ * Êä ³ö : ÎÞ *************************************************************************/ void KeyInit() { GPIO_InitTypeDef GPIO_InitStructure; //ÉùÃ÷Ò»¸ö½á¹¹Ìå±äÁ¿£¬ÓÃÀ´³õʼ»¯GPIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); /* ¿ªÆôGPIOʱÖÓ */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //ÉèÖÃÉÏÀ­ÊäÈëģʽ GPIO_Init(GPIOE, &GPIO_InitStructure); } /************************************************************* * º¯ Êý Ãû : sound1 * º¯Êý¹¦ÄÜ : ·äÃùÆ÷±¨¾¯º¯Êý * Êä Èë : ÎÞ * Êä ³ö : ÎÞ **************************************************************/ void sound1() //¾È»¤³µ±¨¾¯ { u32 i=9000; while(i++) //²úÉúÒ»¶Îʱ¼äµÄPWM²¨£¬Ê¹·äÃùÆ÷·¢Éù { GPIO_SetBits(GPIOC,GPIO_Pin_8); //IO¿ÚÊä³ö¸ßµçƽ delay(i); GPIO_ResetBits(GPIOC,GPIO_Pin_8); //IO¿ÚÊä³öµÍµçƽ delay(i++); } } /************************************************************* * º¯ Êý Ãû : sound2 * º¯Êý¹¦ÄÜ : ·äÃùÆ÷±¨¾¯º¯Êý ͨ¹ý¸Ä±äƵÂÊ¿ØÖÆÉùÒô±ä»¯ * Êä Èë : ÎÞ * Êä ³ö : ÎÞ **************************************************************/ void sound2() //µç¶¯³µ±¨¾¯ { u32 i=1800; while(i++) //²úÉúÒ»¶Îʱ¼äµÄPWM²¨£¬Ê¹·äÃùÆ÷·¢Éù { GPIO_SetBits(GPIOC,GPIO_Pin_8); //IO¿ÚÊä³ö¸ßµçƽ delay(i); GPIO_ResetBits(GPIOC,GPIO_Pin_8); //IO¿ÚÊä³öµÍµçƽ delay(i++); } } /************************************************************************ * º¯ Êý Ãû : BeepKey * º¯Êý¹¦ÄÜ : ¼ì²â°´¼ü ¿ØÖÆ·äÃùÆ÷·¢²»Í¬±¨¾¯Éù * Êä Èë : ÎÞ * Êä ³ö : ÎÞ *************************************************************************/ #include "beepkey.h" #include "delay.h" // ????????? // ????????SysTick??? void BeepKey() { while(1) { if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_0) == 0) { Delay_ms(10); // ??????????? if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_0) == 0) { // ???????? for(int i = 0; i < 500; i++) { GPIO_SetBits(GPIOC, GPIO_Pin_8); Delay_us(278); // 1.8KHz???? ˜ 278us GPIO_ResetBits(GPIOC, GPIO_Pin_8); Delay_us(278); } } while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_0) == 0); } // ... ?????? ... } }上述代码报错APP\beepkey.c(104): error: #29: expected an expression for(int i = 0; i < 500; i++) { APP\beepkey.c(104): error: #20: identifier "i" is undefined for(int i = 0; i < 500; i++) {给出解决办法和完整代码

main文件代码为#include "stm32f10x.h" typedef unsigned int u32; //ÀàÐÍÖØ¶¨Òå unsigned int -- u32 void SystemInit(void) { } /******************************************************************************* * º¯ Êý Ãû : delay * º¯Êý¹¦ÄÜ : ÑÓʱº¯Êý£¬Í¨¹ýwhileÑ­»·Õ¼ÓÃCPU£¬´ïµ½ÑÓʱ¹¦ÄÜ * Êä Èë : i * Êä ³ö : ÎÞ *******************************************************************************/ void delay(u32 i) { while(i--); } /******************************************************************************* * º¯ Êý Ãû : main * º¯Êý¹¦ÄÜ : Ö÷º¯Êý * Êä Èë : ÎÞ * Êä ³ö : ÎÞ *******************************************************************************/ int main() { RCC_APB2ENR |= 1<<3; GPIOB_CRL &= ~( 0x0F<< (4*5)); GPIOB_CRL |= (3<<4*5); GPIOB_BSRR=(1<<(16+5)); while(1) { GPIOB_BSRR=(1<<(16+5)); delay(0xFFFFF); GPIOB_BSRR=(1<<(5)); delay(0xFFFFF); } } stm32代码为#define PERIPH_BASE ((unsigned int)0x40000000) #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) #define GPIOB_CRL *(unsigned int*)(GPIOB_BASE+0x00) #define GPIOB_CRH *(unsigned int*)(GPIOB_BASE+0x04) #define GPIOB_IDR *(unsigned int*)(GPIOB_BASE+0x08) #define GPIOB_ODR *(unsigned int*)(GPIOB_BASE+0x0C) #define GPIOB_BSRR *(unsigned int*)(GPIOB_BASE+0x10) #define GPIOB_BRR *(unsigned int*)(GPIOB_BASE+0x14) #define GPIOB_LCKR *(unsigned int*)(GPIOB_BASE+0x18) #define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) #define RCC_BASE (AHBPERIPH_BASE + 0x1000) #define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18) 将GPIOB灯改为点亮GPIOE,修改代码

#include "dcmi_ov2640.h" #include "dcmi_ov2640_cfg.h" DCMI_HandleTypeDef hdcmi; // DCMI¾ä±ú DMA_HandleTypeDef DMA_Handle_dcmi; // DMA¾ä±ú volatile uint8_t DCMI_FrameState = 0; // DCMI״̬±êÖ¾£¬µ±Êý¾ÝÖ¡´«ÊäÍê³Éʱ£¬»á±» HAL_DCMI_FrameEventCallback() Öжϻص÷º¯ÊýÖà 1 volatile uint8_t OV2640_FPS ; // Ö¡ÂÊ /************************************************************************************************* * º¯ Êý Ãû: HAL_DCMI_MspInit * Èë¿Ú²ÎÊý: hdcmi - DCMI_HandleTypeDef¶¨ÒåµÄ±äÁ¿£¬¼´±íʾ¶¨ÒåµÄ DCMI ¾ä±ú * ·µ »Ø Öµ: ÎÞ * º¯Êý¹¦ÄÜ: ³õʼ»¯ DCMI Òý½Å * ˵ Ã÷: ÎÞ *************************************************************************************************/ void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(hdcmi->Instance==DCMI) { __HAL_RCC_DCMI_CLK_ENABLE(); // ʹÄÜ DCMI ÍâÉèʱÖÓ __HAL_RCC_GPIOE_CLK_ENABLE(); // ʹÄÜÏàÓ¦µÄGPIOʱÖÓ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); GPIO_OV2640_PWDN_CLK_ENABLE; // ʹÄÜPWDN Òý½ÅµÄ GPIO ʱÖÓ /**************************************************************************** Êý¾ÝÒý½Å ʱÖÓºÍͬ²½Òý½Å PH9 ------> DCMI_D0 PG9 ------> DCMI_VSYNC PH10 ------> DCMI_D1 PH8 ------> DCMI_HSYNC PH11 ------> DCMI_D2 PA6 ------> DCMI_PIXCLK PH12 ------> DCMI_D3 PH14 ------> DCMI_D4 SCCB ¿ØÖÆÒý½Å£¬³õʼ»¯ÔÚ camera_sccb.c Îļþ PD3 ------> DCMI_D5 PH7 ------> SCCB_SCL PE5 ------> DCMI_D6 PH13 ------> SCCB_SDA PE6 ------> DCMI_D7 µôµç¿ØÖÆÒý½Å PH15 ------> PWDN ******************************************************************************/ GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); // ³õʼ»¯ PWDN Òý½Å OV2640_PWDN_ON; // ¸ßµçƽ£¬½øÈëµôµçģʽ£¬ÉãÏñÍ·Í£Ö¹¹¤×÷£¬´Ëʱ¹¦ºÄ½µµ½×îµÍ GPIO_InitStruct.Pin = OV2640_PWDN_PIN; // PWDN Òý½Å GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // ÍÆÍìÊä³öģʽ GPIO_InitStruct.Pull = GPIO_PULLUP; // ÉÏÀ­ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Ëٶȵȼ¶µÍ HAL_GPIO_Init(OV2640_PWDN_PORT, &GPIO_InitStruct); // ³õʼ»¯ } } /*************************************************************************************************************************************** * º¯ Êý Ãû: MX_DCMI_Init * * º¯Êý¹¦ÄÜ: ÅäÖÃDCMIÏà¹Ø²ÎÊý * * ˵ Ã÷: 8λÊý¾Ýģʽ£¬È«Êý¾Ý¡¢È«Ö¡²¶×½£¬¿ªÆôÖÐ¶Ï * *****************************************************************************************************************************************/ void MX_DCMI_Init(void) { hdcmi.Instance = DCMI; hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE; // Ó²¼þͬ²½Ä£Ê½£¬¼´Ê¹ÓÃÍⲿµÄVS¡¢HSÐźŽøÐÐͬ²½ hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING; // ÏñËØÊ±ÖÓÉÏÉýÑØÓÐЧ hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW; // VSµÍµçƽÓÐЧ hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW; // HSµÍµçƽÓÐЧ hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME; // ²¶»ñµÈ¼¶£¬ÉèÖÃÿһ֡¶¼½øÐв¶»ñ hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B; // 8λÊý¾Ýģʽ hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE; // ²»Ê¹ÓÃDCMIµÄJPEGģʽ hdcmi.Init.ByteSelectMode = DCMI_BSM_ALL; // DCMI½Ó¿Ú²¶×½ËùÓÐÊý¾Ý hdcmi.Init.ByteSelectStart = DCMI_OEBS_ODD; // Ñ¡Ôñ¿ªÊ¼×Ö½Ú£¬´Ó Ö¡/ÐÐ µÄµÚÒ»¸öÊý¾Ý¿ªÊ¼²¶»ñ hdcmi.Init.LineSelectMode = DCMI_LSM_ALL; // ²¶»ñËùÓÐÐÐ hdcmi.Init.LineSelectStart = DCMI_OELS_ODD; // Ñ¡Ôñ¿ªÊ¼ÐÐ,ÔÚÖ¡¿ªÊ¼ºó²¶»ñµÚÒ»ÐÐ HAL_DCMI_Init(&hdcmi) ; HAL_NVIC_SetPriority(DCMI_IRQn, 0 ,5); // ÉèÖÃÖжÏÓÅÏȼ¶ HAL_NVIC_EnableIRQ(DCMI_IRQn); // ¿ªÆôDCMIÖÐ¶Ï //// ÔÚJPGģʽÏ£¬Ò»¶¨Òªµ¥¶ÀʹÄܸÃÖÐ¶Ï // __HAL_DCMI_ENABLE_IT(&hdcmi, DCMI_IT_FRAME); // ʹÄÜ FRAME ÖÐ¶Ï } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Init * * º¯Êý¹¦ÄÜ: ÅäÖà DMA Ïà¹Ø²ÎÊý * * ˵ Ã÷: ʹÓõÄÊÇDMA2£¬ÍâÉèµ½´æ´¢Æ÷ģʽ¡¢Êý¾Ýλ¿í32bit¡¢²¢¿ªÆôÖÐ¶Ï * *****************************************************************************************************************************************/ void OV2640_DMA_Init(void) { __HAL_RCC_DMA2_CLK_ENABLE(); // ʹÄÜDMA2ʱÖÓ DMA_Handle_dcmi.Instance = DMA2_Stream7; // DMA2Êý¾ÝÁ÷7 DMA_Handle_dcmi.Init.Request = DMA_REQUEST_DCMI; // DMAÇëÇóÀ´×ÔDCMI DMA_Handle_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY; // ÍâÉèµ½´æ´¢Æ÷ģʽ DMA_Handle_dcmi.Init.PeriphInc = DMA_PINC_DISABLE; // ÍâÉèµØÖ·½ûÖ¹×ÔÔö DMA_Handle_dcmi.Init.MemInc = DMA_MINC_ENABLE; // ´æ´¢Æ÷µØÖ·×ÔÔö DMA_Handle_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; // DCMIÊý¾Ýλ¿í£¬32λ DMA_Handle_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; // ´æ´¢Æ÷Êý¾Ýλ¿í£¬32λ DMA_Handle_dcmi.Init.Mode = DMA_CIRCULAR; // Ñ­»·Ä£Ê½ DMA_Handle_dcmi.Init.Priority = DMA_PRIORITY_LOW; // ÓÅÏȼ¶µÍ DMA_Handle_dcmi.Init.FIFOMode = DMA_FIFOMODE_ENABLE; // ʹÄÜfifo DMA_Handle_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; // È«fifoģʽ£¬4*32bit´óС DMA_Handle_dcmi.Init.MemBurst = DMA_MBURST_SINGLE; // µ¥´Î´«Êä DMA_Handle_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE; // µ¥´Î´«Êä HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA __HAL_LINKDMA(&hdcmi, DMA_Handle, DMA_Handle_dcmi); // ¹ØÁªDCMI¾ä±ú HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 0, 0); // ÉèÖÃÖжÏÓÅÏȼ¶ HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); // ʹÄÜÖÐ¶Ï } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Delay * Èë¿Ú²ÎÊý: Delay - ÑÓʱʱ¼ä£¬µ¥Î» ms * º¯Êý¹¦ÄÜ: ¼òµ¥ÑÓʱº¯Êý£¬²»ÊǺܾ«È· * ˵ Ã÷: ΪÁËÒÆÖ²µÄ¼ò±ãÐÔ,´Ë´¦²ÉÓÃÈí¼þÑÓʱ£¬Êµ¼ÊÏîÄ¿ÖпÉÒÔÌæ»»³ÉRTOSµÄÑÓʱ»òÕßHAL¿âµÄÑÓʱ *****************************************************************************************************************************************/ void OV2640_Delay(volatile uint32_t Delay) { volatile uint16_t i; while (Delay --) { for (i = 0; i < 20000; i++); } // HAL_Delay(Delay); // ¿ÉʹÓÃHAL¿âµÄÑÓʱ } /*************************************************************************************************************************************** * º¯ Êý Ãû: DCMI_OV2640_Init * * º¯Êý¹¦ÄÜ: ³õʼSCCB¡¢DCMI¡¢DMAÒÔ¼°ÅäÖÃOV2640 * *****************************************************************************************************************************************/ int8_t DCMI_OV2640_Init(void) { uint16_t Device_ID; // ¶¨Òå±äÁ¿´æ´¢Æ÷¼þID SCCB_GPIO_Config(); // SCCBÒý½Å³õʼ»¯ MX_DCMI_Init(); // ³õʼ»¯DCMIÅäÖÃÒý½Å OV2640_DMA_Init(); // ³õʼ»¯DMAÅäÖà OV2640_Reset(); // Ö´ÐÐÈí¼þ¸´Î» Device_ID = OV2640_ReadID(); // ¶ÁÈ¡Æ÷¼þID if( (Device_ID == 0x2640) || (Device_ID == 0x2642) ) // ½øÐÐÆ¥Å䣬ʵ¼ÊµÄÆ÷¼þID¿ÉÄÜÊÇ 0x2640 »òÕß 0x2642 { printf ("OV2640 OK,ID:0x%X\r\n",Device_ID); // Æ¥Åäͨ¹ý OV2640_Config( OV2640_SVGA_Config ); // ÅäÖà SVGAģʽ ------> 800*600£¬ ×î´óÖ¡ÂÊ30Ö¡ // OV2640_Config( OV2640_UXGA_Config ); // ÅäÖà UXGAģʽ ------> 1600*1200£¬×î´óÖ¡ÂÊ15Ö¡ OV2640_Set_Framesize(OV2640_Width,OV2640_Height); // ÉèÖÃOV2640Êä³öµÄͼÏñ´óС OV2640_DCMI_Crop(Display_Width, Display_Height, OV2640_Width, OV2640_Height ); // ½«OV2640Êä³öͼÏñ²Ã¼ô³ÉÊÊÓ¦ÆÁÄ»µÄ´óС return OV2640_Success; // ·µ»Ø³É¹¦±êÖ¾ } else { printf ("OV2640 ERROR!!!!! ID:%X\r\n",Device_ID); // ¶ÁÈ¡ID´íÎó return OV2640_Error; // ·µ»Ø´íÎó±êÖ¾ } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Transmit_Continuous * * Èë¿Ú²ÎÊý: DMA_Buffer - DMA½«Òª´«ÊäµÄµØÖ·£¬¼´ÓÃÓÚ´æ´¢ÉãÏñÍ·Êý¾ÝµÄ´æ´¢ÇøµØÖ· * DMA_BufferSize - ´«ÊäµÄÊý¾Ý´óС£¬32λ¿í * * º¯Êý¹¦ÄÜ: Æô¶¯DMA´«Ê䣬Á¬ÐøÄ£Ê½ * * ˵ Ã÷: 1. ¿ªÆôÁ¬ÐøÄ£Ê½Ö®ºó£¬»áÒ»Ö±½øÐд«Ê䣬³ý·Ç¹ÒÆð»òÕßÍ£Ö¹DCMI * 2. OV2640ʹÓÃRGB565ģʽʱ£¬1¸öÏñËØµãÐèÒª2¸ö×Ö½ÚÀ´´æ´¢ * 3. ÒòΪDMAÅäÖô«ÊäÊý¾ÝΪ32λ¿í£¬¼ÆËã DMA_BufferSize ʱ£¬ÐèÒª³ýÒÔ4£¬ÀýÈ磺 * Òª»ñÈ¡ 240*240·Ö±æÂÊ µÄͼÏñ£¬ÐèÒª´«Êä 240*240*2 = 115200 ×Ö½ÚµÄÊý¾Ý£¬ * Ôò DMA_BufferSize = 115200 / 4 = 28800 ¡£ *LXB *****************************************************************************************************************************************/ void OV2640_DMA_Transmit_Continuous(uint32_t DMA_Buffer,uint32_t DMA_BufferSize) { DMA_Handle_dcmi.Init.Mode = DMA_CIRCULAR; // Ñ­»·Ä£Ê½ HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA // ʹÄÜDCMI²É¼¯Êý¾Ý,Á¬Ðø²É¼¯Ä£Ê½ HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)DMA_Buffer,DMA_BufferSize); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Transmit_Snapshot * * Èë¿Ú²ÎÊý: DMA_Buffer - DMA½«Òª´«ÊäµÄµØÖ·£¬¼´ÓÃÓÚ´æ´¢ÉãÏñÍ·Êý¾ÝµÄ´æ´¢ÇøµØÖ· * DMA_BufferSize - ´«ÊäµÄÊý¾Ý´óС£¬32λ¿í * * º¯Êý¹¦ÄÜ: Æô¶¯DMA´«Ê䣬¿ìÕÕģʽ£¬´«Êäһ֡ͼÏñºóÍ£Ö¹ * * ˵ Ã÷: 1. ¿ìÕÕģʽ£¬Ö»´«ÊäÒ»Ö¡µÄÊý¾Ý * 2. OV2640ʹÓÃRGB565ģʽʱ£¬1¸öÏñËØµãÐèÒª2¸ö×Ö½ÚÀ´´æ´¢ * 3. ÒòΪDMAÅäÖô«ÊäÊý¾ÝΪ32λ¿í£¬¼ÆËã DMA_BufferSize ʱ£¬ÐèÒª³ýÒÔ4£¬ÀýÈ磺 * Òª»ñÈ¡ 240*240·Ö±æÂÊ µÄͼÏñ£¬ÐèÒª´«Êä 240*240*2 = 115200 ×Ö½ÚµÄÊý¾Ý£¬ * Ôò DMA_BufferSize = 115200 / 4 = 28800 ¡£ * 4. ʹÓøÃģʽ´«ÊäÍê³ÉÖ®ºó£¬DCMI»á±»¹ÒÆð£¬ÔÙ´ÎÆôÓô«Êä֮ǰ£¬ÐèÒªµ÷Óà OV2640_DCMI_Resume() »Ö¸´DCMI * *****************************************************************************************************************************************/ void OV2640_DMA_Transmit_Snapshot(uint32_t DMA_Buffer,uint32_t DMA_BufferSize) { DMA_Handle_dcmi.Init.Mode = DMA_NORMAL; // Õý³£Ä£Ê½ HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_SNAPSHOT, (uint32_t)DMA_Buffer,DMA_BufferSize); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Suspend * * º¯Êý¹¦ÄÜ: ¹ÒÆðDCMI£¬Í£Ö¹²¶»ñÊý¾Ý * * ˵ Ã÷: 1. ¿ªÆôÁ¬ÐøÄ£Ê½Ö®ºó£¬ÔÙµ÷Óøú¯Êý£¬»áÍ£Ö¹²¶»ñDCMIµÄÊý¾Ý * 2. ¿ÉÒÔµ÷Óà OV2640_DCMI_Resume() »Ö¸´DCMI * 3. ÐèҪעÒâµÄ£¬¹ÒÆðDCMIÆÚ¼ä£¬DMAÊÇûÓÐÍ£Ö¹¹¤×÷µÄ *LXB *****************************************************************************************************************************************/ void OV2640_DCMI_Suspend(void) { HAL_DCMI_Suspend(&hdcmi); // ¹ÒÆðDCMI } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Resume * * º¯Êý¹¦ÄÜ: »Ö¸´DCMI£¬¿ªÊ¼²¶»ñÊý¾Ý * * ˵ Ã÷: 1. µ±DCMI±»¹ÒÆðʱ£¬¿ÉÒÔµ÷Óøú¯Êý»Ö¸´ * 2. ʹÓà OV2640_DMA_Transmit_Snapshot() ¿ìÕÕģʽ£¬´«ÊäÍê³ÉÖ®ºó£¬DCMIÒ²»á±»¹ÒÆð£¬ÔÙ´ÎÆôÓô«Êä֮ǰ£¬ * ÐèÒªµ÷Óñ¾º¯Êý»Ö¸´DCMI²¶»ñ * *****************************************************************************************************************************************/ void OV2640_DCMI_Resume(void) { (&hdcmi)->State = HAL_DCMI_STATE_BUSY; // ±ä¸üDCMI±êÖ¾ (&hdcmi)->Instance->CR |= DCMI_CR_CAPTURE; // ¿ªÆôDCMI²¶»ñ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Stop * * º¯Êý¹¦ÄÜ: ½ûÖ¹DCMIµÄDMAÇëÇó£¬Í£Ö¹DCMI²¶»ñ£¬½ûÖ¹DCMIÍâÉè * *****************************************************************************************************************************************/ void OV2640_DCMI_Stop(void) { HAL_DCMI_Stop(&hdcmi); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Crop * * Èë¿Ú²ÎÊý: Displey_XSize ¡¢Displey_YSize - ÏÔʾÆ÷µÄ³¤¿í * Sensor_XSize¡¢Sensor_YSize - ÉãÏñÍ·´«¸ÐÆ÷Êä³öͼÏñµÄ³¤¿í * * º¯Êý¹¦ÄÜ: ʹÓÃDCMIµÄ²Ã¼ô¹¦ÄÜ£¬½«´«¸ÐÆ÷Êä³öµÄͼÏñ²Ã¼ô³ÉÊÊÓ¦ÆÁÄ»µÄ´óС * * ˵ Ã÷: 1. ÒòΪÉãÏñÍ·Êä³öµÄ»­Ãæ±ÈÀý¹Ì¶¨Îª4:3£¬²»Ò»¶¨Æ¥ÅäÏÔʾÆ÷ * 2. ÐèҪעÒâµÄÊÇ£¬ÉãÏñÍ·Êä³öµÄͼÏñ³¤¡¢¿í±ØÐëÒªÄܱ»4Õû³ý£¡£¨ ʹÓÃOV2640_Set_Framesizeº¯Êý½øÐÐÉèÖà £© * 3. DCMIµÄˮƽÓÐЧÏñËØÒ²±ØÐëÒªÄܱ»4Õû³ý£¡ * 4. º¯Êý»á¼ÆËãˮƽºÍ´¹Ö±Æ«ÒÆ£¬¾¡Á¿Èû­Ãæ¾ÓÖвüô *****************************************************************************************************************************************/ int8_t OV2640_DCMI_Crop(uint16_t Displey_XSize,uint16_t Displey_YSize,uint16_t Sensor_XSize,uint16_t Sensor_YSize ) { uint16_t DCMI_X_Offset,DCMI_Y_Offset; // ˮƽºÍ´¹Ö±Æ«ÒÆ£¬´¹Ö±´ú±íµÄÊÇÐÐÊý£¬Ë®Æ½´ú±íµÄÊÇÏñËØÊ±ÖÓÊý£¨PCLKÖÜÆÚÊý£© uint16_t DCMI_CAPCNT; // ˮƽÓÐЧÏñËØ£¬´ú±íµÄÊÇÏñËØÊ±ÖÓÊý£¨PCLKÖÜÆÚÊý£© uint16_t DCMI_VLINE; // ´¹Ö±ÓÐЧÐÐÊý if( (Displey_XSize>=Sensor_XSize)|| (Displey_YSize>=Sensor_YSize) ) { // printf("ʵ¼ÊÏÔʾµÄ³ß´ç´óÓÚ»òµÈÓÚÉãÏñÍ·Êä³öµÄ³ß´ç£¬Í˳öDCMI²Ã¼ô\r\n"); return OV2640_Error; //Èç¹ûʵ¼ÊÏÔʾµÄ³ß´ç´óÓÚ»òµÈÓÚÉãÏñÍ·Êä³öµÄ³ß´ç£¬ÔòÍ˳öµ±Ç°º¯Êý£¬²»½øÐвüô } // ÔÚÉèÖÃΪRGB565¸ñʽʱ£¬Ë®Æ½Æ«ÒÆ£¬±ØÐëÊÇÆæÊý£¬·ñÔò»­ÃæÉ«²Ê²»ÕýÈ·£¬ // ÒòΪһ¸öÓÐЧÏñËØÊÇ2¸ö×Ö½Ú£¬ÐèÒª2¸öPCLKÖÜÆÚ£¬ËùÒÔ±ØÐë´ÓÆæÊýλ¿ªÊ¼£¬²»È»Êý¾Ý»á´íÂÒ£¬ // ÐèҪעÒâµÄÊÇ£¬¼Ä´æÆ÷ÖµÊÇ´Ó0¿ªÊ¼ËãÆðµÄ £¡ DCMI_X_Offset = Sensor_XSize - Displey_XSize; // ʵ¼Ê¼ÆËã¹ý³ÌΪ£¨Sensor_XSize - LCD_XSize£©/2*2 // ¼ÆËã´¹Ö±Æ«ÒÆ£¬¾¡Á¿Èû­Ãæ¾ÓÖвüô£¬¸ÃÖµ´ú±íµÄÊÇÐÐÊý£¬ DCMI_Y_Offset = (Sensor_YSize - Displey_YSize)/2-1; // ¼Ä´æÆ÷ÖµÊÇ´Ó0¿ªÊ¼ËãÆðµÄ£¬ËùÒÔÒª-1 // ÒòΪһ¸öÓÐЧÏñËØÊÇ2¸ö×Ö½Ú£¬ÐèÒª2¸öPCLKÖÜÆÚ£¬ËùÒÔÒª³Ë2 // ×îÖյõ½µÄ¼Ä´æÆ÷Öµ£¬±ØÐëÒªÄܱ»4Õû³ý£¡ DCMI_CAPCNT = Displey_XSize*2-1; // ¼Ä´æÆ÷ÖµÊÇ´Ó0¿ªÊ¼ËãÆðµÄ£¬ËùÒÔÒª-1 DCMI_VLINE = Displey_YSize-1; // ´¹Ö±ÓÐЧÐÐÊý // printf("%d %d %d %d\r\n",DCMI_X_Offset,DCMI_Y_Offset,DCMI_CAPCNT,DCMI_VLINE); HAL_DCMI_ConfigCrop (&hdcmi,DCMI_X_Offset,DCMI_Y_Offset,DCMI_CAPCNT,DCMI_VLINE);// ÉèÖòüô´°¿Ú HAL_DCMI_EnableCrop(&hdcmi); // ʹÄܲüô return OV2640_Success; } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Reset * * º¯Êý¹¦ÄÜ: Ö´ÐÐÈí¼þ¸´Î» * * ˵ Ã÷: ÔÚÅäÖÃOV2640֮ǰ£¬ÐèÒªÖ´ÐÐÒ»´ÎÈí¼þ¸´Î» * *****************************************************************************************************************************************/ void OV2640_Reset(void) { OV2640_Delay(5); // µÈ´ýÄ£¿éÉϵçÎȶ¨£¬×îÉÙ5ms£¬È»ºóÀ­µÍPWDN OV2640_PWDN_OFF; // PWDN Òý½ÅÊä³öµÍµçƽ£¬²»¿ªÆôµôµçģʽ£¬ÉãÏñÍ·Õý³£¹¤×÷£¬´ËʱÉãÏñÍ·Ä£¿éµÄ°×É«LED»áµãÁÁ // ¸ù¾ÝOV2640µÄÉϵçʱÐò£¬Ó²¼þ¸´Î»µÄ³ÖÐøÊ±¼äÒª>=3ms£¬Â¹Ð¡°àµÄOV2640²ÉÓÃÓ²¼þRC¸´Î»£¬³ÖÐøÊ±¼ä´ó¸ÅÔÚ6ms×óÓÒ // Òò´Ë¼ÓÈëÑÓʱ£¬µÈ´ýÓ²¼þ¸´Î»Íê³É²¢Îȶ¨ÏÂÀ´ OV2640_Delay(5); SCCB_WriteReg( OV2640_SEL_Registers, OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR ¼Ä´æÆ÷×é SCCB_WriteReg( OV2640_SENSOR_COM7, 0x80); // Æô¶¯Èí¼þ¸´Î» // ¸ù¾ÝOV2640µÄÈí¼þ¸´Î»Ê±Ðò£¬Èí¼þ¸´Î»Ö´Ðкó£¬Òª>=2ms·½¿ÉÖ´ÐÐSCCBÅäÖ㬴˴¦²ÉÓñ£ÊØÒ»µãµÄ²ÎÊý£¬ÑÓʱ10ms OV2640_Delay(10); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_ReadID * * º¯Êý¹¦ÄÜ: ¶ÁÈ¡ OV2640 µÄÆ÷¼þID * * ˵ Ã÷: ʵ¼ÊµÄÆ÷¼þID¿ÉÄÜÊÇ 0x2640 »òÕß 0x2642£¬Åú´Î²»Í¬ID¿ÉÄܻ᲻һÑù * *****************************************************************************************************************************************/ uint16_t OV2640_ReadID(void) { uint8_t PID_H,PID_L; // ID±äÁ¿ SCCB_WriteReg( OV2640_SEL_Registers, OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR ¼Ä´æÆ÷×é PID_H = SCCB_ReadReg(OV2640_SENSOR_PIDH); // ¶ÁÈ¡ID¸ß×Ö½Ú PID_L = SCCB_ReadReg(OV2640_SENSOR_PIDL); // ¶ÁÈ¡IDµÍ×Ö½Ú return(PID_H<<8)|PID_L; // ·µ»ØÍêÕûµÄÆ÷¼þID } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Config * * Èë¿Ú²ÎÊý: (*ConfigData)[2] - ÒªÅäÖõIJÎÊý£¬¿ÉÅäÖÃΪ OV2640_SVGA_Config »ò OV2640_UXGA_Config * * º¯Êý¹¦ÄÜ: ÅäÖà OV2640 ´«¸ÐÆ÷ºÍDSP²ÎÊý * * ˵ Ã÷: 1. ¿ÉÅäÖÃΪ SVGA »òÕß UXGAģʽ * 2. SVGA ·Ö±æÂÊΪ800*600£¬×î¸ßÖ§³Ö30Ö¡ * 3. UXGA ·Ö±æÂÊΪ1600*1200£¬×î¸ßÖ§³Ö15Ö¡ * 4. ²ÎÊý¶¨ÒåÔÚ dcmi_ov2640_cfg.h * *****************************************************************************************************************************************/ void OV2640_Config( const uint8_t (*ConfigData)[2] ) { uint32_t i; // ¼ÆÊý±äÁ¿ for( i=0; ConfigData[i][0]; i++) { SCCB_WriteReg( ConfigData[i][0], ConfigData[i][1]); // ½øÐвÎÊýÅäÖà } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Framesize * * Èë¿Ú²ÎÊý: pixformat - ÏñËØ¸ñʽ£¬¿ÉÑ¡Ôñ Pixformat_RGB565¡¢Pixformat_JPEG * * º¯Êý¹¦ÄÜ: ÉèÖÃÊä³öµÄÏñËØ¸ñʽ * *****************************************************************************************************************************************/ void OV2640_Set_Pixformat(uint8_t pixformat) { const uint8_t (*ConfigData)[2]; uint32_t i; // ¼ÆÊý±äÁ¿ switch (pixformat) { case Pixformat_RGB565: ConfigData = OV2640_RGB565_Config; break; case Pixformat_JPEG: ConfigData = OV2640_JPEG_Config; break; default: break; } for( i=0; ConfigData[i][0]; i++) { SCCB_WriteReg( ConfigData[i][0], ConfigData[i][1]); // ½øÐвÎÊýÅäÖà } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Framesize * * Èë¿Ú²ÎÊý: width - ʵ¼ÊÊä³öͼÏñµÄ³¤¶È£¬height - ʵ¼ÊÊä³öͼÏñµÄ¿í¶È * * º¯Êý¹¦ÄÜ: ÉèÖÃʵ¼ÊÊä³öµÄͼÏñ´óС * * ˵ Ã÷: 1. OV2640ÉèÖÃΪ SVGA£¨800*600£© »òÕß UXGA£¨1600*1200£©Ä£Ê½£¬Í¼Ïñ´óСͨ³£Óëʵ¼ÊÓÃµÄÆÁÄ»·Ö±æÂʲ»Ò»Ñù£¬ * Òò´Ë¿ÉÒÔµ÷Óôκ¯Êý£¬ÉèÖÃʵ¼ÊÊä³öµÄͼÏñ´óС * 2. ÐèҪעÒâµÄÊÇ£¬ÒªÉèÖõÄͼÏñ³¤¡¢¿í±ØÐëÄܱ»4Õû³ý£¡ * 3. ²¢²»ÊÇÉèÖÃÊä³öµÄͼÏñ·Ö±æÂÊԽС֡ÂʾÍÔ½¸ß£¬Ö¡ÂÊÖ»ºÍÅäÖõÄģʽÓйأ¬ÀýÈçÅäÖÃΪSVGA×î¸ßÖ»ÄÜÖ§³Ö30Ö¡ * *****************************************************************************************************************************************/ int8_t OV2640_Set_Framesize(uint16_t width,uint16_t height) { if( (width%4)||(height%4) ) // Êä³öͼÏñµÄ´óСһ¶¨ÒªÄܱ»4Õû³ý { return OV2640_Error; // ·µ»Ø´íÎó±êÖ¾ } SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ÷×é SCCB_WriteReg(0X5A, width/4 &0XFF); // ʵ¼ÊͼÏñÊä³öµÄ¿í¶È£¨OUTW£©£¬7~0 bit£¬¼Ä´æÆ÷µÄÖµµÈÓÚʵ¼ÊÖµ/4 SCCB_WriteReg(0X5B, height/4 &0XFF); // ʵ¼ÊͼÏñÊä³öµÄ¸ß¶È£¨OUTH£©£¬7~0 bit£¬¼Ä´æÆ÷µÄÖµµÈÓÚʵ¼ÊÖµ/4 SCCB_WriteReg(0X5C, (width/4>>8&0X03)|(height/4>>6&0x04) ); // ÉèÖÃZMHHµÄBit[2:0]£¬Ò²¾ÍÊÇOUTH µÄµÚ 8 bit£¬OUTW µÄµÚ 9~8 bit£¬ SCCB_WriteReg(OV2640_DSP_RESET,0X00); // ¸´Î» return OV2640_Success; // ³É¹¦ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Horizontal_Mirror * * Èë¿Ú²ÎÊý: ConfigState - ÖÃ1ʱ£¬Í¼Ïñ»áˮƽ¾µÏñ£¬ÖÃ0ʱ»Ö¸´Õý³£ * * º¯Êý¹¦ÄÜ: ÓÃÓÚÉèÖÃÊä³öµÄͼÏñÊÇ·ñ½øÐÐˮƽ¾µÏñ * *****************************************************************************************************************************************/ int8_t OV2640_Set_Horizontal_Mirror( int8_t ConfigState ) { uint8_t OV2640_Reg; // ¼Ä´æÆ÷µÄÖµ SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR ¼Ä´æÆ÷×é OV2640_Reg = SCCB_ReadReg(OV2640_SENSOR_REG04); // ¶ÁÈ¡ 0x04 µÄ¼Ä´æÆ÷Öµ // REG04,¼Ä´æÆ÷×é4£¬¼Ä´æÆ÷µØÖ·Îª 0x04£¬¸Ã¼Ä´æÆ÷µÄBit[7]£¬ÓÃÓÚÉèÖÃˮƽÊÇ·ñ¾µÏñ if ( ConfigState == OV2640_Enable ) // Èç¹ûʹÄܾµÏñ { OV2640_Reg |= 0X80; // Bit[7]ÖÃ1Ôò¾µÏñ } else // È¡Ïû¾µÏñ { OV2640_Reg &= ~0X80; // Bit[7]ÖÃ0ÔòÊÇÕý³£Ä£Ê½ } return SCCB_WriteReg(OV2640_SENSOR_REG04,OV2640_Reg); // дÈë¼Ä´æÆ÷ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Vertical_Flip * * Èë¿Ú²ÎÊý: ConfigState - ÖÃ1ʱ£¬Í¼Ïñ»á´¹Ö±·­×ª£¬ÖÃ0ʱ»Ö¸´Õý³£ * * º¯Êý¹¦ÄÜ: ÓÃÓÚÉèÖÃÊä³öµÄͼÏñÊÇ·ñ½øÐд¹Ö±·­×ª * *****************************************************************************************************************************************/ int8_t OV2640_Set_Vertical_Flip( int8_t ConfigState ) { uint8_t OV2640_Reg; // ¼Ä´æÆ÷µÄÖµ SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR ¼Ä´æÆ÷×é OV2640_Reg = SCCB_ReadReg(OV2640_SENSOR_REG04); // ¶ÁÈ¡ 0x04 µÄ¼Ä´æÆ÷Öµ // REG04,¼Ä´æÆ÷×é4£¬¼Ä´æÆ÷µØÖ·Îª 0x04£¬¸Ã¼Ä´æÆ÷µÄµÚBit[6]£¬ÓÃÓÚÉèÖÃˮƽÊÇ´¹Ö±·­×ª if ( ConfigState == OV2640_Enable ) { // ´Ë´¦ÉèÖòο¼OpenMVµÄÇý¶¯ // Bit[4]¾ßÌåµÄ×÷ÓÃÊÇʲôÊÖ²áûÓÐ˵£¬Èç¹û´¹Ö±·­×ªÖ®ºó£¬¸Ãλ²»ÖÃ1µÄ»°£¬ÑÕÉ«»á²»¶Ô OV2640_Reg |= 0X40|0x10 ; // Bit[6]ÖÃ1ʱ£¬Í¼Ïñ»á´¹Ö±·­×ª } else // È¡Ïû·­×ª { OV2640_Reg &= ~(0X40|0x10 ); // ½«Bit[6]ºÍBit[4]¶¼Ð´0 } return SCCB_WriteReg(OV2640_SENSOR_REG04,OV2640_Reg); // дÈë¼Ä´æÆ÷ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Saturation * * Èë¿Ú²ÎÊý: Saturation - ±¥ºÍ¶È£¬¿ÉÉèÖÃΪ5¸öµÈ¼¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ÷ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2.±¥ºÍ¶ÈÔ½¸ß£¬É«²Ê¾ÍÔ½ÏÊÑÞ£¬µ«µ±ÏàÓ¦µÄÇåÎú¶È»áϽµ£¬Ôëµã±ä¶à * *****************************************************************************************************************************************/ void OV2640_Set_Saturation(int8_t Saturation) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ÷×é switch (Saturation) { case 2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x68); SCCB_WriteReg(OV2640_DSP_BPDATA,0x68); break; case 1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x58); SCCB_WriteReg(OV2640_DSP_BPDATA,0x58); break; case 0: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x48); SCCB_WriteReg(OV2640_DSP_BPDATA,0x48); break; case -1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x38); SCCB_WriteReg(OV2640_DSP_BPDATA,0x38); break; case -2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x28); SCCB_WriteReg(OV2640_DSP_BPDATA,0x28); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Brightness * * Èë¿Ú²ÎÊý: Brightness - ÁÁ¶È£¬¿ÉÉèÖÃΪ5¸öµÈ¼¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ÷ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2. ÁÁ¶ÈÔ½¸ß£¬»­Ãæ¾ÍÔ½Ã÷ÁÁ£¬µ«ÊÇ»á±äÄ£ºýһЩ * *****************************************************************************************************************************************/ void OV2640_Set_Brightness(int8_t Brightness) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ÷×é switch (Brightness) { case 2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x40); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case 1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x30); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case 0: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case -1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x10); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case -2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Contrast * * Èë¿Ú²ÎÊý: Contrast - ¶Ô±È¶È£¬¿ÉÉèÖÃΪ5¸öµÈ¼¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ÷ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2. ¶Ô±È¶ÈÔ½¸ß£¬»­ÃæÔ½ÇåÎú£¬ºÚ°×Ô½¼Ó·ÖÃ÷ * *****************************************************************************************************************************************/ void OV2640_Set_Contrast(int8_t Contrast) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ÷×é switch (Contrast) { case 2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x28); SCCB_WriteReg(OV2640_DSP_BPDATA,0x0c); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case 1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x24); SCCB_WriteReg(OV2640_DSP_BPDATA,0x16); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case 0: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x20); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case -1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x1c); SCCB_WriteReg(OV2640_DSP_BPDATA,0x2a); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case -2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x18); SCCB_WriteReg(OV2640_DSP_BPDATA,0x34); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Effect * * Èë¿Ú²ÎÊý: effect_Mode - ÌØÐ§Ä£Ê½£¬¿ÉÑ¡Ôñ²ÎÊý OV2640_Effect_Normal¡¢OV2640_Effect_Negative¡¢ * OV2640_Effect_BW¡¢OV2640_Effect_BW_Negative * * º¯Êý¹¦ÄÜ: ÓÃÓÚÉèÖÃOV2640µÄÌØÐ§£¬Õý³£¡¢¸ºÆ¬¡¢ºÚ°×¡¢ºÚ°×+¸ºÆ¬µÈģʽ * * ˵ Ã÷: ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ÷ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * *****************************************************************************************************************************************/ void OV2640_Set_Effect(uint8_t effect_Mode) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ÷×é switch (effect_Mode) { case OV2640_Effect_Normal: // Õý³£Ä£Ê½ SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; case OV2640_Effect_Negative: // ¸ºÆ¬Ä£Ê½£¬Ò²¾ÍÊÇÑÕɫȫ²¿È¡·´ SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x40); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; case OV2640_Effect_BW: // ºÚ°×ģʽ SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x18); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; case OV2640_Effect_BW_Negative: // ºÚ°×+¸ºÆ¬Ä£Ê½ SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x58); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: HAL_DCMI_FrameEventCallback * * º¯Êý¹¦ÄÜ: Ö¡»Øµ÷º¯Êý£¬Ã¿´«ÊäÒ»Ö¡Êý¾Ý£¬»á½øÈë¸ÃÖжϷþÎñº¯Êý * * ˵ Ã÷: ÿ´Î´«ÊäÍêÒ»Ö¡£¬¶ÔÏàÓ¦µÄ±ê־λ½øÐвÙ×÷£¬²¢¼ÆËãÖ¡ÂÊ *****************************************************************************************************************************************/ void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi) { static uint32_t DCMI_Tick = 0; // ÓÃÓÚ±£´æµ±Ç°µÄʱ¼ä¼ÆÊýÖµ static uint8_t DCMI_Frame_Count = 0; // Ö¡Êý¼ÆÊý if(HAL_GetTick() - DCMI_Tick >= 1000) // ÿ¸ô 1s ¼ÆËãÒ»´ÎÖ¡ÂÊ { DCMI_Tick = HAL_GetTick(); // ÖØÐ»ñÈ¡µ±Ç°Ê±¼ä¼ÆÊýÖµ OV2640_FPS = DCMI_Frame_Count; // »ñµÃfps DCMI_Frame_Count = 0; // ¼ÆÊýÇå0 } DCMI_Frame_Count ++; // û½øÈëÒ»´ÎÖжϣ¨Ã¿´Î´«ÊäÍêÒ»Ö¡Êý¾Ý£©£¬¼ÆÊýÖµ+1 DCMI_FrameState = 1; // ´«ÊäÍê³É±ê־λÖÃ1 } /*************************************************************************************************************************************** * º¯ Êý Ãû: HAL_DCMI_ErrorCallback * * º¯Êý¹¦ÄÜ: ´íÎ󻨵÷º¯Êý * * ˵ Ã÷: µ±·¢ÉúDMA´«Êä´íÎó»òÕßFIFOÒç³ö´íÎó¾Í»á½øÈë *****************************************************************************************************************************************/ void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi) { // if( HAL_DCMI_GetError(hdcmi) == HAL_DCMI_ERROR_OVR) // { // printf("FIFOÒç³ö´íÎ󣡣¡£¡\r\n"); // } printf("error:0x%x£¡£¡£¡\r\n",HAL_DCMI_GetError(hdcmi)); } /*********************************************************************************************************************************************************************************************************************************************LXB*************/ // ¹С°à 代码分析

大家在看

recommend-type

西安市行政区划(区县)

西安市行政区划的矢量文件,WGS 1984 坐标系,到乡镇区一级。 如果想要其他的地区的可以留言,可以上传。
recommend-type

ansys后处理的教程

很好的ansys后处理教程,同大伙分享一下
recommend-type

基于matlab的第三代SNN脉冲神经网络的仿真,含仿真操作录像

1.版本:matlab2021a,包含仿真操作录像,操作录像使用windows media player播放。 2.领域:SNN脉冲神经网络 3.内容:基于matlab的第三代SNN脉冲神经网络的仿真。 epoch = T/ms; for i = 1:floor(epoch/4) for j = 1:4 loc = fix(4*(i-1)*ms + find(input(1,:) == 1) * ms); inputSpikes(1, loc) = 1; loc = fix(4*(i-1)*ms + find(input(2,:) == 1) * ms); inputSpikes(2, loc) = 1; loc = fix(4*(i-1)*ms + find(output(1,:) == 1) * ms); outputSpikes(1, loc) = 1; 4.注意事项:注意MATLAB左侧当前文件夹路径,必须是程序所在文件夹位置,具体可以参考视频录。
recommend-type

新工创项目-基于树莓派5+ROS2的智能物流小车视觉系统(源码+使用教程+模型文件).zip

新工创项目-基于树莓派5+ROS2的智能物流小车视觉系统(源码+使用教程+模型文件) 【项目介绍】 基于 ROS2 的智能物流小车视觉系统。 主要功能 基于 Raspberry Pi 5 和 Ubuntu 24.04 的运行环境 使用 OpenCV 和 YOLO 进行物体检测和跟踪 集成了 usb_cam 和 yolo_ros 等重要依赖包 提供了一键启动和手动启动的方式 操作系统: Raspberry Pi 5, Ubuntu 24.04 编程语言: Python 3.12, C++ 框架/库: ROS2-jazzy, OpenCV, YOLO 【运行】 编译 colcon build 运行节点 一键启动 source install/setup.bash ros2 launch launch/start_all.launch.py
recommend-type

PyPDF2-1.26.0.tar.gz

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

最新推荐

recommend-type

中小学校网络视频监控解决方案.doc

中小学校网络视频监控解决方案.doc
recommend-type

分治算法实验报告.docx

分治算法实验报告.docx
recommend-type

基于BACF算法的实时目标跟踪技术

资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 在计算机视觉领域,实时目标跟踪是许多应用的核心任务,例如监控系统、自动驾驶汽车和无人机导航等。本文将重点介绍一种在2017年备受关注的高效目标跟踪算法——BACF(Boosted Adaptive Clustering Filter)。该算法因其卓越的实时性和高精度而脱颖而出,其核心代码是用MATLAB编写的。 BACF算法全称为Boosted Adaptive Clustering Filter,是基于卡尔曼滤波器改进的一种算法。传统卡尔曼滤波在处理复杂背景和目标形变时存在局限性,而BACF通过引入自适应聚类和Boosting策略,显著提升了对目标特征的捕获和跟踪能力。 自适应聚类是BACF算法的关键技术之一。它通过动态更新特征空间中的聚类中心,更准确地捕捉目标的外观变化,从而在光照变化、遮挡和目标形变等复杂情况下保持跟踪的稳定性。此外,BACF还采用了Boosting策略。Boosting是一种集成学习方法,通过组合多个弱分类器形成强分类器。在BACF中,Boosting用于优化目标检测性能,动态调整特征权重,强化对目标识别贡献大的特征,从而提高跟踪精度。BACF算法在设计时充分考虑了计算效率,能够在保持高精度的同时实现快速实时的目标跟踪,这对于需要快速响应的应用场景(如视频监控和自动驾驶)至关重要。 MATLAB作为一种强大的数学计算和数据分析工具,非常适合用于算法的原型开发和测试。BACF算法的MATLAB实现提供了清晰的代码结构,方便研究人员理解其工作原理并进行优化和扩展。通常,BACF的MATLAB源码包含以下部分:主函数(实现整个跟踪算法的核心代码)、特征提取模块(从视频帧中提取目标特征的子程序)、聚类算法(实现自适应聚类过程)、Boosting算法(包含特征权重更新的代
recommend-type

这篇文章主要探讨了基于李雅普诺夫方法的深度强化学习在保证性能方面的应用 以下是文章的主要内容和结构:

内容概要:本书《Deep Reinforcement Learning with Guaranteed Performance》探讨了基于李雅普诺夫方法的深度强化学习及其在非线性系统最优控制中的应用。书中提出了一种近似最优自适应控制方法,结合泰勒展开、神经网络、估计器设计及滑模控制思想,解决了不同场景下的跟踪控制问题。该方法不仅保证了性能指标的渐近收敛,还确保了跟踪误差的渐近收敛至零。此外,书中还涉及了执行器饱和、冗余解析等问题,并提出了新的冗余解析方法,验证了所提方法的有效性和优越性。 适合人群:研究生及以上学历的研究人员,特别是从事自适应/最优控制、机器人学和动态神经网络领域的学术界和工业界研究人员。 使用场景及目标:①研究非线性系统的最优控制问题,特别是在存在输入约束和系统动力学的情况下;②解决带有参数不确定性的线性和非线性系统的跟踪控制问题;③探索基于李雅普诺夫方法的深度强化学习在非线性系统控制中的应用;④设计和验证针对冗余机械臂的新型冗余解析方法。 其他说明:本书分为七章,每章内容相对独立,便于读者理解。书中不仅提供了理论分析,还通过实际应用(如欠驱动船舶、冗余机械臂)验证了所提方法的有效性。此外,作者鼓励读者通过仿真和实验进一步验证书中提出的理论和技术。
recommend-type

cc65 Windows完整版发布:6502 C开发工具

cc65是一个针对6502处理器的完整C编程开发环境,特别适用于Windows操作系统。6502处理器是一种经典的8位微处理器,于1970年代被广泛应用于诸如Apple II、Atari 2600、NES(任天堂娱乐系统)等早期计算机和游戏机中。cc65工具集能够允许开发者使用C语言编写程序,这对于那些希望为这些老旧系统开发软件的程序员来说是一大福音,因为相较于汇编语言,C语言更加高级、易读,并且具备更好的可移植性。 cc65开发工具包主要包含以下几个重要组件: 1. C编译器:这是cc65的核心部分,它能够将C语言源代码编译成6502处理器的机器码。这使得开发者可以用高级语言编写程序,而不必处理低级的汇编指令。 2. 链接器:链接器负责将编译器生成的目标代码和库文件组合成一个单独的可执行程序。在6502的开发环境中,链接器还需要处理各种内存段的定位和映射问题。 3. 汇编器:虽然主要通过C语言进行开发,但某些底层操作仍然可能需要使用汇编语言来实现。cc65包含了一个汇编器,允许程序员编写汇编代码段。 4. 库和运行时:cc65提供了一套标准库,这些库函数为C语言提供了支持,并且对于操作系统级别的功能进行了封装,使得开发者能够更方便地进行编程。运行时支持包括启动代码、中断处理、内存管理等。 5. 开发工具和文档:除了基本的编译、链接和汇编工具外,cc65还提供了一系列辅助工具,如反汇编器、二进制文件编辑器、交叉引用器等。同时,cc65还包含丰富的文档资源,为开发者提供了详尽的使用指南、编程参考和示例代码。 cc65可以广泛用于学习和开发6502架构相关的软件,尤其适合那些对6502处理器、复古计算机或者早期游戏系统有兴趣的开发者。这些开发者可能想要创建或修改旧式游戏、系统软件、仿真器,或者进行技术研究和学习。 尽管cc65是一个功能强大的工具,但它也要求开发者对目标平台的硬件架构和操作系统有足够的了解。这是因为6502并非现代处理器,它对内存访问、I/O操作和中断管理等有着特殊的限制和要求。因此,使用cc65需要开发者具备一定的背景知识,包括但不限于6502指令集、内存映射、硬件寄存器操作等方面的内容。 此外,cc65针对Windows平台进行了优化和封装,使得它可以在Windows操作系统上无缝运行,这对于习惯于Windows环境的用户是一个好消息。不过,如果用户使用的是其他操作系统,可能需要通过相应的兼容层或虚拟机来运行Windows环境,以便使用cc65工具。 总的来说,cc65提供了一种相对简单的方式来开发运行在6502处理器上的软件。它极大地降低了开发难度,使得更多的人能够接触和参与到基于6502平台的软件开发中来,为这个历史悠久的平台注入了新的活力。
recommend-type

【CLIP模型实战】:从数据预处理到代码实现的图文相似度计算完全指南

# 1. CLIP模型概述 在人工智能领域中,CLIP(Contrastive Language-Image Pre-training)模型作为一款开创性的多模态学习技术,已经成为业界瞩目的焦点。CLIP模型是由OpenAI在2021年推出的,其创新之处在于通过大规模的图文对齐数据进行预训练,能够理解和匹配图像与自然语言描述之间的关联性。CLIP突破了传统方法在特定任务上需要大规模标注数据的限制
recommend-type

车载以太网doip协议格式

<think>首先,用户的问题是:“我想查找关于车载以太网DOIP协议的数据格式或规范”。用户引用了站内内容,其中提到DoIP是基于以太网的通讯协议,用于传输UDS协议的数据,规范于ISO13400标准。关键点:-DoIP协议:DiagnosticcommunicationoverInternetProtocol-规范:ISO13400标准-数据格式:我需要提供关于DoIP数据格式的详细信息根据系统级指令:-所有行内数学表达式使用$...$格式-独立公式使用$$...$$格式并单独成段-LaTeX语法正确-使用中文回答-生成相关问题-回答中引用的段落末尾自然地添加引用标识-回答结构清晰,帮助用
recommend-type

JavaScript中文帮助手册:初学者实用指南

### JavaScript中文帮助手册知识点概述 #### 1. JavaScript简介 JavaScript是一种轻量级的编程语言,广泛用于网页开发。它能够增强用户与网页的交互性,使得网页内容变得动态和富有生气。JavaScript能够操纵网页中的HTML元素,响应用户事件,以及与后端服务器进行通信等。 #### 2. JavaScript基本语法 JavaScript的语法受到了Java和C语言的影响,包括变量声明、数据类型、运算符、控制语句等基础组成部分。以下为JavaScript中常见的基础知识点: - 变量:使用关键字`var`、`let`或`const`来声明变量,其中`let`和`const`是ES6新增的关键字,提供了块级作用域和不可变变量的概念。 - 数据类型:包括基本数据类型(字符串、数值、布尔、null和undefined)和复合数据类型(对象、数组和函数)。 - 运算符:包括算术运算符、关系运算符、逻辑运算符、位运算符等。 - 控制语句:条件判断语句(if...else、switch)、循环语句(for、while、do...while)等。 - 函数:是JavaScript中的基础,可以被看作是一段代码的集合,用于封装重复使用的代码逻辑。 #### 3. DOM操作 文档对象模型(DOM)是HTML和XML文档的编程接口。JavaScript可以通过DOM操作来读取、修改、添加或删除网页中的元素和内容。以下为DOM操作的基础知识点: - 获取元素:使用`getElementById()`、`getElementsByTagName()`等方法获取页面中的元素。 - 创建和添加元素:使用`document.createElement()`创建新元素,使用`appendChild()`或`insertBefore()`方法将元素添加到文档中。 - 修改和删除元素:通过访问元素的属性和方法,例如`innerHTML`、`textContent`、`removeChild()`等来修改或删除元素。 - 事件处理:为元素添加事件监听器,响应用户的点击、鼠标移动、键盘输入等行为。 #### 4. BOM操作 浏览器对象模型(BOM)提供了独立于内容而与浏览器窗口进行交互的对象和方法。以下是BOM操作的基础知识点: - window对象:代表了浏览器窗口本身,提供了许多属性和方法,如窗口大小调整、滚动、弹窗等。 - location对象:提供了当前URL信息的接口,可以用来获取URL、重定向页面等。 - history对象:提供了浏览器会话历史的接口,可以进行导航历史操作。 - screen对象:提供了屏幕信息的接口,包括屏幕的宽度、高度等。 #### 5. JavaScript事件 JavaScript事件是用户或浏览器自身执行的某些行为,如点击、页面加载、键盘按键、鼠标移动等。通过事件,JavaScript可以对这些行为进行响应。以下为事件处理的基础知识点: - 事件类型:包括鼠标事件、键盘事件、表单事件、窗口事件等。 - 事件监听:通过`addEventListener()`方法为元素添加事件监听器,规定当事件发生时所要执行的函数。 - 事件冒泡:事件从最深的节点开始,然后逐级向上传播到根节点。 - 事件捕获:事件从根节点开始,然后逐级向下传播到最深的节点。 #### 6. JavaScript高级特性 随着ECMAScript标准的演进,JavaScript引入了许多高级特性,这些特性包括但不限于: - 对象字面量增强:属性简写、方法简写、计算属性名等。 - 解构赋值:可以从数组或对象中提取数据,赋值给变量。 - 模板字符串:允许嵌入表达式。 - 异步编程:Promise、async/await等用于处理异步操作。 - 模块化:使用`import`和`export`关键字导入和导出模块。 - 类和模块:引入了`class`关键字,允许使用面向对象编程风格定义类,以及模块的声明。 #### 7. 开发工具和调试技巧 为了提高JavaScript开发效率和调试问题,以下是一些常用的工具和调试技巧: - 浏览器的开发者工具:包括控制台(Console)、元素查看器(Elements)、网络监控(Network)、源码编辑器(Sources)等。 - 断点调试:在源码编辑器中设置断点,逐步执行代码,查看变量值和程序流程。 - console.log:在控制台输出日志,帮助理解程序执行流程和变量状态。 - 使用JavaScript验证工具:如JSHint、ESLint等,可以在开发过程中进行代码质量检查。 以上就是《JavaScript中文帮助手册》中可能包含的主要知识点。作为初学者,通过这些内容可以系统地学习和掌握JavaScript基础和进阶知识,实现从初学到实践的跨越。在实际应用中,还需结合具体实例和项目练习,不断加深理解和熟练操作。
recommend-type

深入理解MySQL存储引擎:InnoDB与MyISAM的终极对决

# 1. MySQL存储引擎概述 MySQL数据库的灵活性和高性能在很大程度上得益于其存储引擎架构。**存储引擎**是MySQL中用于存储、索引、查询数据的底层软件模块。不同的存储引擎拥有不同的功能和特性,允许数据库管理员针对特定的应用需求选择最佳的存储引擎。例如,**InnoDB**提供事务支持和行级锁定,适用于需要ACID(原子
recommend-type

window中系统中断,cpu占用100%

<think>首先,用户的问题是关于解决Windows系统中“系统中断”导致CPU占用100%的问题。我需要基于提供的引用和系统指令来构建一个结构清晰的回答。系统指令:-所有行内数学表达式必须使用$...$格式。-独立公式使用$$...$$格式并单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-在回答中引用的段落末尾添加引用标识,例如[^1]。-回答结构清晰,帮助用户逐步解决问题。-参考站内引用:引用[1]是关于CPU使用率100%的应急措施,引用[2]是关于Java程序CPU占用过高的解决步骤,引用[3]是关于CPU软中断导致高利用率的分析与解决方案。用户的问题:Window