一,打开cubemx,配置时钟等参数,具体操作方法和上一节一样
二,配置串口1
在cubemx上打开串口1,并设置波特率,其他参数保持默认,配置完成如下图所示:
三,打开串口中断
点击NVIC SETTING,勾选相应选项如下图
四、生成代码,具体方法与上节一样
1、在usart.c中添加如下代码:
- uint8_t aRecBuff[1];
- uint8_t Uart1Buff[REC_LEN];
- uint16_t USART_RX_STA=0;
- int fputc(int ch, FILE *f)//printf的重映射
- {
- HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
- return ch;
- }
复制代码
2、 添加中断回调函数(参考正点原子函数接收方法)
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
- {
- if(huart->Instance == USART1)
- {
- if((USART_RX_STA&0x8000)==0)//接收未完成
- {
- if(USART_RX_STA&0x4000)//接收到了0x0d
- {
- if(aRecBuff[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
- else USART_RX_STA|=0x8000; //接收完成了
- }
- else //还没收到0X0D
- {
- if(aRecBuff[0]==0x0d)USART_RX_STA|=0x4000;
- else
- {
- Uart1Buff[USART_RX_STA&0X3FFF]=aRecBuff[0] ;
- USART_RX_STA++;
- if(USART_RX_STA>(REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
- }
- }
- }
- }
- }
复制代码
3、在stm32f7xx_it.c文件中的void USART1_IRQHandler(void)函数中添加如下代码,以保证进入串口中断后再次开启接收中断,添加完成的代码如下:
- 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 */
- HAL_UART_Receive_IT(&huart1,aRecBuff,1);
- /* USER CODE END USART1_IRQn 1 */
- }
复制代码
4、在主函数中添加代码开启串口接收中断
- HAL_UART_Receive_IT(&huart1,aRecBuff,1);
复制代码
5、在主循环添加代码,串口接收完成后,打印接收的内容(注;串口发送的内容需以换行符结尾),更改完成的主函数如下所示:
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- /* USER CODE END 1 */
- /* Enable I-Cache---------------------------------------------------------*/
- SCB_EnableICache();
- /* Enable D-Cache---------------------------------------------------------*/
- SCB_EnableDCache();
- /* MCU Configuration--------------------------------------------------------*/
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* USER CODE BEGIN Init */
- /* USER CODE END Init */
- /* Configure the system clock */
- SystemClock_Config();
- /* USER CODE BEGIN SysInit */
- /* USER CODE END SysInit */
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_USART1_UART_Init();
- /* USER CODE BEGIN 2 */
- HAL_UART_Receive_IT(&huart1,aRecBuff,1);
- printf("uart test is run!!!\r\n");
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- if(USART_RX_STA&0x8000)
- {
- printf("recdata is :%s\r\n",Uart1Buff);
- USART_RX_STA=0;
- memset(Uart1Buff,0,REC_LEN);
- }
- }
- /* USER CODE END 3 */
- }
复制代码
如果编译memset出错,则添加string.h头文件即可。
五,编译下载,打开串口调试助手观察现象
开机系统打印uart test is run!!!,向串口发送“这是一个串口实验”,则在串口就会显示“recdata is :这是一个串口实验" 注:发送新行需要勾选)
|