|
对于小MCU来说,IAP更新多使用串口方式。要完成IAP功能,串口的发送与接收便不可少。考虑到IAP功能简单,唯一,也没有更高的性能要求。所以,暂就以简单的查询方式来实现串口的发送与接收。 串口的初始化代码与接收发送API的源代码如下: - void uart_init(void)
- {
- GPIO_Config_T gpioConfig;
- USART_Config_T usartConfigStruct;
- /* Enable GPIO clock */
- RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
- RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_USART1);
- /* Connect PXx to USARTx_Tx */
- GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_9, GPIO_AF_PIN1);
- GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_10, GPIO_AF_PIN1);
- /* Configure USART Tx as alternate function push-pull */
- gpioConfig.mode = GPIO_MODE_AF;
- gpioConfig.pin = GPIO_PIN_9;
- gpioConfig.speed = GPIO_SPEED_50MHz;
- gpioConfig.outtype = GPIO_OUT_TYPE_PP;
- gpioConfig.pupd = GPIO_PUPD_PU;
- GPIO_Config(GPIOA, &gpioConfig);
- /* Configure USART Rx as input floating */
- gpioConfig.pin = GPIO_PIN_10;
- GPIO_Config(GPIOA, &gpioConfig);
- /* TINY_USARTs configured as follow:
- - BaudRate = 115200 baud
- - Word Length = 8 Bits
- - One Stop Bit
- - No parity
- - Hardware flow control disabled (RTS and CTS signals)
- - Receive and transmit enabled
- */
- usartConfigStruct.baudRate = 9600;
- usartConfigStruct.mode = USART_MODE_TX_RX;
- usartConfigStruct.hardwareFlowCtrl = USART_FLOW_CTRL_NONE;
- usartConfigStruct.parity = USART_PARITY_NONE;
- usartConfigStruct.stopBits = USART_STOP_BIT_1;
- usartConfigStruct.wordLength = USART_WORD_LEN_8B;
- USART_Config(COM_USART[COM], &usartConfigStruct);
- /* Enable USART */
- USART_Enable(USART1);
- }
- void uart_sendblock(uint8_t dat)
- {
- /* Wait until end of transmission */
- while (USART_ReadStatusFlag(USART1, USART_FLAG_TXBE) == RESET)
- {
- ;
- }
- USART_TxData(USART1, dat);
- }
- uint8_t uart_receiveblock(void)
- {
- uint8_t dat;
- while (USART_ReadStatusFlag(USART1, USART_FLAG_RXBNE) == RESET)
- {
- ;
- }
- dat = USART_RxData(USART1);
- return (ret);
- }
串口的接收与发送API还是比较简单的,我在测试IAP时,也发送在数据线一般长度下,串口的通讯质量非常高。坦白讲,根本就不需要CRC校验。所以,我在IAP的文件上传过程也放弃了Y-Modem协议。在生产环境下,并没有产生异常的情况。下一个帖子,我再分享一下IAP的简单流程。
|