打开cubeMX,点击PB5,选择GPIO_EXTI5
打开GPIO模块,双击PB5,然后在MODE中选择Rising/Falling这个
打开PA1,默认level为low,灯为亮状态
选择NVIC,点击最后一个,进行中断
RCC配置:配置时钟源为外部时钟源
时钟树设置:
打开工程:
在项目代码中,打开stm32f1xx_hal_gpio.c文件可以找到中断服务函数
根据我们前面的设置,上升沿就会触发这个函数,在这个函数中调用了另外一个名为HAL_GPIO_EXTI_Callback()函数
这个函数是回调函数,前面__weak表示此函数为虚函数,需要用户重写。
在main.c文件中添加如下代码:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { /* Prevent unused argument(s) compilation warning */ HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1); //翻转电平 /* NOTE: This function Should not be modified, when the callback is needed, the HAL_GPIO_EXTI_Callback could be implemented in the user file */ }
CubeMX配置:
配置USART1为异步通信模式:
使能USART1中断:
生成代码,打开项目。
编写代码:
在main.c中添加定义
uint8_t aRxBuffer; //接收中断缓冲 uint8_t Uart1_RxBuff[256]; //接收缓冲 uint8_t Uart1_Rx_Cnt = 0; //接收缓冲计数 uint8_t cAlmStr[] = "数据溢出(大于256)\r\n";
在main函数如下位置处添加代码:
/* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); /* USER CODE END 2 */ ` ```python /* USER CODE BEGIN 4 */ /** * @brief Rx Transfer completed callbacks. * @param huart pointer to a UART_HandleTypeDef structure that contains * the configuration information for the specified UART module. * @retval None */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { /* Prevent unused argument(s) compilation warning */ UNUSED(huart); /* NOTE: This function Should not be modified, when the callback is needed, the HAL_UART_TxCpltCallback could be implemented in the user file */ if(Uart1_Rx_Cnt >= 255) //溢出判断 { Uart1_Rx_Cnt = 0; for(int i=0;i<255;i++) { Uart1_RxBuff[i]=0; } HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF); } else { Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer; //接收数据转存 if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位 { HAL_UART_Transmit(&huart1, (uint8_t *)&Uart1_RxBuff, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去 Uart1_Rx_Cnt = 0; for(int i=0;i<255;i++) { Uart1_RxBuff[i]=0; } //清空数组 } } HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断 } /* USER CODE END 4 */c
CubeMX
RCC设置外部高速时钟HSE 选择外部时钟源
设置串口
DMA设置:
点击add:
生成代码
在main.c中添加代码:
/* USER CODE BEGIN Init */ uint8_t Senbuff[] = "HELLO WORLD!!!"; //定义数据发送数组 /* USER CODE END Init */
在while循环中添加代码:
while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff)-1); //串口发送Senbuff数组 HAL_Delay(1000); } /* USER CODE END 3 */ }
如果不开启中断,程序只能发送一次数据,程序无法判断DMA传输是否完成。
参考文献:https://blog.csdn.net/qq_45659777/article/details/121111629?spm=1001.2014.3001.5501
https://blog.csdn.net/qq_45659777/article/details/121110712?spm=1001.2014.3001.5501