一. 了解并掌握HAL库函数开发方法。使用stm32CubeMX配合Keil练习
1、用GPIOA端口4,5,6引脚完成LED灯的周期闪烁。
打开stm32CubeMX后,选择file,选择new project,创建新工程
在Commercial Part Number处输入stm32f103c8t6,在右下角MCUs/MPUs List处下面双击stm32f103c8t6
在Pinout & Configuration下找到System Core,单点SYS,将Debug选为Serial Wire
再选择RCC,选择High Speed Clock (HSE)为CrystalCeramic Resonator
在右下角的Pinout view中,找到PA4,PA5,PA6的引脚,依次左键选择GPIO_Output
将PA4,PA5,PA6的GPIO output level依次选择为High
选择Clock Configuration,将system Clock Mux,PLL,APB1 Prescaler里的参数一次修改如下图
选择Project Manager的Project模块补充Project Name和Toolchain Folder Location,在Toolchain /IDE中选择MDK-ARM,Min Version选择V5.32(根据自己的keil-5软件版本进行选择),取消Firmware Package Name and Version后面的小勾,选择STM32Cube FW_F1V1.8.0的包(根据自己下载的STM32F1的包版本进行选择)
在Code Generator的Generated files一栏中勾选Generate peripheral initialization as a pair of ‘.cl.h’ files per peripheral,最后点击GENERATE CODE就可以生成keil文件了
在生成的keil文件中,找到main.c,在int main(void)里的while循环里编辑以下代码,编译,烧录。
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
HAL_Delay(1000);
实物图:
2、接上,再用GPIOB端3,4,5管脚接3个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,对应的LED灯停止工作(即停止周期性闪烁),接低电平时,恢复工作。
对EXIT配置:
在NVIC中勾选
在生成的keil文件里找到stm32f1xx_hal_gpio.c,再把
weak_void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
更改为
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin),把函数内容更改为如下代码:
if(GPIO_Pin == GPIO_PIN_3){
GPIO_PinState pinState = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3);
if(pinState==GPIO_PIN_RESET)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
}
if(GPIO_Pin == GPIO_PIN_4){
GPIO_PinState pinState = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_4);
if(pinState==GPIO_PIN_RESET)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}
if(GPIO_Pin == GPIO_PIN_5){
GPIO_PinState pinState = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5);
if(pinState==GPIO_PIN_RESET)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
}
实物图:
二. 在没有示波器条件下,使用Keil的软件仿真逻辑分析仪功能观察LED管脚的时序波形,分析按键中断时,LED灯的波形变化情况。
当按键中断时,对应管脚为高电平,控制的LED管脚变为高电平。
4.总结
好学。