目录
一、采用中断模式点亮LED灯
1、 中断
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
2、新建工程
在STM32CubeMX中新建一个芯片为STM32F103C8的工程。
详细步骤如下:
file ,新建工程
RCC配置
配置时钟
8改为72
配置SYS
将A2引脚设置为GPIO_OUTPUT;将B0引脚设置为GPIO_EXTI0;
生成代码
打开工程
3、编写代码(打开工程)
在main.c中编写回调函数:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
GPIO_PinState b0_pin = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0); // 读取b0的状态
switch (GPIO_Pin){
case GPIO_PIN_0:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, b0_pin); // 将a2写入与b0相同的电位
break;
}
}
选择相应的hex,然后插上连接好的电路
开始编程:
4、运行亮灯
电路连接
运行结果
高电平(插入正极),灯灭;
低电平(将插入正极的导线拔出),灯亮;
二、中断方式实现串口通信
1、创建项目
创建流程与上一个相似
流程如下:
然后生成代码
打开工程
2、编写代码
打开main.c文件
在文件中定义缓冲区大小:
#define LENGTH 10 // 接收缓冲区大小
定义缓冲区和标志位:
uint8_t RxBuffer[LENGTH]; // 接收缓冲区
uint8_t Rxflag = 0; // 标志位,0为接收未完成,1为接收完成
在main()中定义接收成功信息:
HAL_UART_Receive_IT(&huart1, (uint8_t*)RxBuffer, LENGTH); // 使能接收中断
char data[] = "\nReveive Success\n"; // 接收成功信息
在while循环中发送成功信息和接收到的信息:
if (Rxflag == 1){ // 若数据接收完成
Rxflag = 0; // 清除标志位
HAL_UART_Transmit(&huart1, (uint8_t *)data, 18, 0xFFFF); // 接收成功信息
// 发送接收到的字符
HAL_UART_Transmit_IT(&huart1, (uint8_t*)RxBuffer, LENGTH);
}
在main.c中定义回调函数:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if (huart->Instance == USART1){
Rxflag = 1; // 设置标志位为1
HAL_UART_Receive_IT(&huart1, (uint8_t*)&RxBuffer, LENGTH); // 使能接收中断
}
}
运行编译:
打开串口调试工具,设置波特率等:
三、DMA实现串口通信
1、创建
(同上)
附加设置如下:
2、代码编写
在main.c的while循环中写入以下代码:
uint8_t data[] = "Hello Windows\r\n";
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)data,16);
HAL_Delay(1000); //延时
3、运行结果
编译运行烧录
四、总结
学习了stm32中断、DMA通信原理和编程方法,
通过实验再次熟悉了串口调试。多次使用stm32tubemx和HAL库分别完成编程练习。
同时在操作过程中了解了自己的不足,加深了软件的熟练度。
不过还不是很熟练,还需要多加练习尝试。