STM32F103C8的中断与DMA通信
Posted 伊木子曦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32F103C8的中断与DMA通信相关的知识,希望对你有一定的参考价值。
一、准备工作
- STM32开发板(我的是STM32F103C8T6)
- STM32CubeMx软件、 IDE: Keil软件
- STM32F1xxHAL库
- 用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。
- 采用串口中断方式的串口通信。
- 按键管脚 PB0
- LED管脚 PA12
二、新建工程
- New Project
- 搜索芯片型号
- 选择芯片
- 创建工程
- 设置RCC
- 点击RCC
- 高速时钟(HSE)选择外部晶振
- 软件自动配置管脚
- GPIO初始化
LED:1个GPIO_OUTPUT (输出模式)
按键:1个GPIO_EXITx(外部中断模式)
- 点击对应管脚
- 设置对应模式
我们的按键选择上升沿触发中断
-
设置串口的中断
-
设置NVIC(嵌套向量中断控制器)
-
DMA设置
根据DMA通道预览可以知道,我们用的USART1 的TX RX 分别对应DMA1 的通道4和通道5
- 点击DMA Settings 点击 Add 添加通道
- 选择USART_RX USART_TX 传输速率设置为中速
- DMA传输模式为正常模式
- DMA内存地址自增,每次增加一个Byte(字节)
- 时钟源设置
- 选择外部时钟HSE 8MHz
- PLL锁相环倍频9倍
- 系统时钟来源选择为PLL
- 设置APB1分频器为 /2
- 项目文件设置
- 设置项目名称
- 设置存储路径
- 选择basic
- 选择所用IDE
这个看自己的选择
- 创建工程文件
随后我们可以在stm32f1xx_it.c中看到我们所配置的中断服务函数 并且可以看到gpio的初始化分到了gpio.c里面
三、执行
- GPIO中断
重写回调函数
在main.c中
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
}
while循环中
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET); HAL_Delay(1000);
结果:
- 串口中断
在main.c中
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
if(length>20){
memset(message,0,sizeof(message));
HAL_UART_Transmit(&huart1, (uint8_t *)&message, sizeof(message),0xFFFF);
memset(message,0,sizeof(message));
length=0;
}
else{
message[length++]=c;
if(c=='\\n'){
HAL_UART_Transmit(&huart1, (uint8_t *)&message, sizeof(message),0xFFFF);
length=0;
memset(message,0,sizeof(message));
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);//重新设置中断
/* NOTE: This function should not be modified, when the callback is needed,
the HAL_UART_RxCpltCallback could be implemented in the user file
*/
}
在while中
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(1000);
HAL_UART_Transmit(&huart1, (uint8_t *)&data, sizeof(data),0xFFFF);
}
- DMA通信
main.c
uint8_t Senbuff[] = "\\r\\n**** Serial Output Message by DMA ***\\r\\n "; //定义数据发送数组
在while循环中
//DMA
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
HAL_Delay(1000);
四、参考
以上是关于STM32F103C8的中断与DMA通信的主要内容,如果未能解决你的问题,请参考以下文章
STM32F103VET6基于STM32CubeMX创建串口中断+ DMA 不定长数据接收