一, stm32外部中断模式控制灯亮灭
1,新建项目
2,配置RCC
3,配置SYS
4,配置GPIO
5,设置引脚
6,NVIC设置触发方式选择下降沿触发
7,使能引脚对应的外部中断线 EXTI line[15:10]
8,配置中断优先级
8,创建项目
8,打开工程编写代码
外部中断处理函数
/*
* @brief EXTI line detection callbacks.
* @param GPIO_Pin: Specifies the pins connected EXTI line,
* @retval None
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if( GPIO_Pin == B1_EXTI_Pin ) // 判断外部中断源
{
HAL_GPIO_TogglePin(LD1_GPIO_Port, LD1_Pin); // 翻转LD1状态
}
}
9,烧录
引脚
A5–LED灯
B15—开关
第五周
第五周2
10,结果
采用中断模式编程,当开关接入高电平后LED变亮。当开关接低电平后LED熄灭。
二,串口中断方式进行串口通信
1,CubeMX配置项目
2,选择芯片
3,设置RCC
4,设置SYS
5,设置USART1
7,创建项目,打开keil
8,在keil配置代码
在main函数前定义全局变量
char c;//指令 0:停止 1:开始
char message[]="hello Windows\n";//输出信息
char tips[]="CommandError\n";//提示1
char tips1[]="S\n";//提示2
char tips2[]="T\n";//提示3
int flag=0;//标志 0:停止发送 1.开始发送
9,main主函数中接收中断的设置
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
对()中代码的解释
UART_HandleTypeDef *huart UATR的别名
huart1 *pData 接收到的数据存放地址
Size 接收的字节数
1. 串口中断接收,以中断方式接收指定长度数据。
2. 大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。
3. 接收到数据时,会触发串口中断。
4. 再然后,串口中断函数处理,直到接收到指定长度数据
5. 而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)
10,main函数中的while循环里面添加传输代码
if(flag==1){
//发送信息
HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF);
//延时
HAL_Delay(1000);
}
11,在main函数下面添加中断处理函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//当输入的指令为0时,发送提示并改变flag
if(c=='0'){
flag=0;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF);
}
//当输入的指令为1时,发送提示并改变flag
else if(c=='1'){
flag=1;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF);
}
//当输入不存在指令时,发送提示并改变flag
else {
flag=0;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF);
}
//重新设置中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
}
12,编译
13,烧录结果
第七周
三,DMA方式发送数据
1,创建工程
设置RCC
2,设置串口
点击USATR1
设置MODE为异步通信(Asynchronous)
基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 接收和发送都使能
GPIO引脚自动设置 USART1_RX/USART_TX
NVIC Settings 一栏使能接收中断
3,DMA设置
点击DMASettings 点击 Add 添加通道
选择USART_RX USART_TX 传输速率设置为中速
DMA传输模式为正常模式
DMA内存地址自增,每次增加一个Byte(字节)
4,时钟设置
选择外部时钟HSE 8MHz
PLL锁相环倍频9倍
系统时钟来源选择为PLL
设置APB1分频器为 /2
使能CSS监视时钟
5,项目文件设置
6,配置下载工程
7,在main.C中添加
uint8_t Senbuff[] = "Hello world!"; //定义数据发送数组
while循环
while (1)
{
/* USER CODE END WHILE */
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
8,串口测试
四,总结
通过这次实验,我充分了解学习了stm32中断、DMA通信原理和编程方法,使用stm32tubemx和HAL库这两种不同的方法完成了实验题目,同时也对这两种方法进行了深入学习。实验过程中遇到很多困难,不断试错,调试,终于完成了实验要求。
五,参考
stm32中断实现LED灯亮灭
HAL库中断方式进行串口通信
HAL库 STM32CubeMX教程十一—DMA (串口DMA发送接收)