STM32中断与DMA通信编程
作者:互联网
文章目录
一.STM32中断
打开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
二.DMA通信编程
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
标签:DMA,HAL,UART,Rx,编程,Uart1,uint8,STM32,USER 来源: https://blog.csdn.net/xieyang929/article/details/121214118