完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、时钟的配置
二、USART的配置 1、引脚配置 2、中断及其他配置 三、LED的配置(GPIO) 四、工程的配置 使用的HAL库版本为: 五、代码 生成的串口中断代码如下: void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ /* USER CODE END USART1_IRQn 1 */ } HAL_UART_IRQHandler为串口中断回调函数,其中包含一个中断接收虚回调函数(HAL_UART_RxCpltCallback),我们可以自己在虚函数中实现自己想要的功能(即我们的单片机串口接收到数据就会进入中断,去执行HAL_UART_RxCpltCallback中的内容)。调用关系如下图所示: 虚函数的实现如下: /*__weak */void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { /* Prevent unused argument(s) compilation warning */ //UNUSED(huart); if(huart->Instance==USART1) { HAL_GPIO_TogglePin(Led0_GPIO_Port, Led0_Pin); HAL_UART_Receive_IT(&huart1,aRxBuffer1,1);// 重新使能串口1接收中断 } } 重新使能串口1接收中断 }} 主要功能就是我们的单片机串口接收到数据后,LED0发生状态翻转。 如上图所示,发送1时,开发板上LED0会发生状态翻转。 /** * @brief Receive an amount of data in interrupt mode. * @param huart UART handle. * @param pData pointer to data buffer. * @param Size amount of data to be received. * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) { /* Check that a Rx process is not already ongoing */ if(huart->RxState == HAL_UART_STATE_READY) { if((pData == NULL ) || (Size == 0U)) { return HAL_ERROR; } /* Process Locked */ __HAL_LOCK(huart); huart->pRxBuffPtr = pData; huart->RxXferSize = Size; huart->RxXferCount = Size; /* Computation of UART mask to apply to RDR register */ UART_MASK_COMPUTATION(huart); huart->ErrorCode = HAL_UART_ERROR_NONE; huart->RxState = HAL_UART_STATE_BUSY_RX; /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */ SET_BIT(huart->Instance->CR3, USART_CR3_EIE); /* Enable the UART Parity Error and Data Register not empty Interrupts */ SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE); return HAL_OK; } else { return HAL_BUSY; } } 函数可以使能串口处于中断接收模式,所以在函数初始化时,需要调用一次,在进入中断接收回调函数中,处理完想要执行的功能后,需要再次调用一次,重新使能串口接收中断。 |
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9050 浏览 16 评论
4085 浏览 18 评论
1171浏览 3评论
602浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
594浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2331浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 06:15 , Processed in 1.043048 second(s), Total 81, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号