嵌入式系统开发
快捷键
alt + / : 代码提示
ctrl + 鼠标左: 查看代码实现
alt + ← : 返回跳转前的代码
项目1-Hello world
1、创建STM32项目

2、选择型号

3、配置项目名称

4、项目初始化概览

5、根据需求,查看文档引脚说明
打开提供的:MB1296D-01.PDF,次出是控制LED灯,因此找到LED等引脚相关信息。

6、到CUBE IDE配置对应的模式
分别配置PA5、PB5、PB6、PB7的模式为输出,高电平有效等。


7、保存修改

保存会提示弹出一些对话框,都选择Yes

8、创建完成
查看对应的文件结构,其中CMSIS是ARM等定义的HAL,硬件抽象层。

查看main.c

9、修改代码,实现针脚输出高电平

10、重新编译

编译,看是否报错
11、调试

确定

查看断点

12、修改代码使得蓝灯、绿灯闪,红灯常亮。
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_RTC_Init();MX_SPI1_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){// write pin led HAL_GPIO_WritePin(LD2_RED_GPIO_Port, LD2_RED_Pin, GPIO_PIN_RESET);// flash blue ledHAL_GPIO_TogglePin(LD3_BLUE_GPIO_Port, LD3_BLUE_Pin);// flash green ledHAL_GPIO_TogglePin(LD_GREEN_GPIO_Port, LD_GREEN_Pin);HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
13、查看结果

注意:调试接口接入的位置
项目2-按钮实现闪灯
需求:板上有两个按钮,一蓝和一黑。黑色是重置,而蓝色是给用户自定义的。接下实现按钮控制LED灯的亮与灭。

1、观察电路图

发现需要将PB2口设置为输入悬空
2、CUBE IDE设置对应GPIO口的模式

3、编码读取按钮状态
int main(void)
{
// ... 省略while (1){// GPIO_PIN_RESET 低电平// GPIO_PIN_SET 高电平// Anti-Hunting (Remember)if (HAL_GPIO_ReadPin(B2_BUTTON_GPIO_Port, B2_BUTTON_Pin) == GPIO_PIN_RESET) {HAL_Delay(15);if (HAL_GPIO_ReadPin(B2_BUTTON_GPIO_Port, B2_BUTTON_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin(LD3_BLUE_GPIO_Port, LD3_BLUE_Pin);HAL_GPIO_TogglePin(LD_GREEN_GPIO_Port, LD_GREEN_Pin);// Release inspectionwhile (HAL_GPIO_ReadPin(B2_BUTTON_GPIO_Port, B2_BUTTON_Pin) == GPIO_PIN_RESET);}}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
需要注意的是:
-
抖动消除:代码中采用双if加延时,抖动消除。消抖是为了避免在按键按下或是抬起时电平剧烈抖动带来的影响。
-
松手检测:代码中的while用来实现松手检测。一般传统的松手检测都是用一个while死循环等待松手的
4、小总结
- 实现按钮控制LED灯的时候,主要注意按钮状态的读取。
- 在对按钮状态读取的时候,需要注意「抖动消除」和「松手检测」来线程按下按钮的机械特性。
项目3-按钮控制(中断方式)
需求:用中断方式,控制灯的闪烁快慢。
此处有两个疑问,一是中断处理函数在哪里;二是如果控制灯闪烁的快慢。
1、设置按钮的输入输出方式为中断模式

2、其中GPIO mode 的介绍如下

由于按钮电路按下的时候是触发下降沿,因此我们需要设置为下降沿中断触发。
3、NVIC

设置NVIC中断为运行,PB2对应EXTI2
4、中断通道

5、进入函数内部

6、重写函数(此函数会在中断发送的时候执行)

总结4/5/6三步就是
- stm32l0xx_it.c中的EXTI2_3_IRQHandler是用于处理EXTI2和EXTI3的中断请求
- 在本项目中调用了HAL_GPIO_EXTI_IRQHandler函数对指定引脚中断进行处理
- HAL_GPIO_EXTI_IRQHandler内部会先判断该引脚中断是否可用,可用就继续执行HAL_GPIO_EXTI_Callback,真正的中断处理函数
- 在stm32l0xx_it.c中的HAL_GPIO_EXTI_Callback是weak修饰,说明可用被重写
- 这里直接把这部分函数搬到main.c的用户自定义区域,重写即可
7、总结:只需要将函数HAL_GPIO_EXTI_Callback复制到main函数中,重写即可
// 全局变量
int flag=0;// 主函数
int main(void)
{while (1){HAL_GPIO_TogglePin(LD3_BLUE_GPIO_Port, LD3_BLUE_Pin);if (flag == 0) {HAL_Delay(150);} else {HAL_Delay(500);}}
}// 中断处理函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{// 简单将flag反转flag = !flag;
}
项目4-按钮控制串口通信(中断方式)
需求:按钮按下,同串口通信给PC发送Hello
1、设置串口通信信息

2、编码
在中断回调函数调用串口发送函数
// 全局函数
uint8_t aTxbuf[] = {'h','e','l','l','o'};// 主函数
int main(void) {// ... 无需修改逻辑
}// 中断回调处理函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {// 串口写,5个字符HAL_UART_Transmit(&huart2, aTxbuf, 5, 1000);flag = !flag;
}
3、使用串口调试助手读取数据
此处需要注意:波特率,奇偶校验,数据位需要与Cube IDE中配置的保存一致。
下载只需要百度「XCOM串口助手」即可

















