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 led HAL_GPIO_TogglePin(LD3_BLUE_GPIO_Port, LD3_BLUE_Pin); // flash green led HAL_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 inspection while (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串口助手」即可