实验软件:CubeMx,KeilMDK,mcuisp
实验管脚:PA1,PB1,PB10
实验器材:若干LED,若干跳线,面包板,一个F103C8T6,一个USB转TTL
一.搭配STM32的开发环境
(一)安装jdk
官网:https://www.oracle.com/java/technologies/javase-downloads.html
(二)安装STM32CubeMX
详细下载过程请参考:【精选】STM32基于HAL库流水灯实验_hel库安装教程中文版-CSDN博客
二.HEL库GPIO端口3只LED红绿灯的周期闪烁
(一)项目构建
1. 点击New Project
2. 选择STM32F103C8芯片
3. SYS选择
选择Serial Wire
4. RCC选择
选择RCC序列
5. 端口设置,选择需要的端口,设置GPIO_OUTPUT,设置PA1,PB1,PB10
设置GPIO output level为High
6. Clock Configuretion设置
7.Project Manager设置
勾选Generate perpheral initialization as a pair
(二)代码修改
在main修改
在while中修改
while (1)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET);
HAL_Delay(1000);
}
(三)烧入程序
运行效果
二.中断控制流水灯
用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作。
(一)新建工程
将PA3作为开关
使能中断
(二)重写中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == SWITCH_Pin){
//获取A3的电位,如果是低电平就一直死循环,使流水灯停止工作
while(HAL_GPIO_ReadPin(SWITCH_GPIO_Port,SWITCH_Pin)==GPIO_PIN_RESET){}
}
}
while循环内的代码
while (1)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET);
HAL_Delay(1000);
}
(三)中断控制一个灯亮灭
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == SWITCH_Pin){
GPIO_PinState pinState = HAL_GPIO_ReadPin(SWITCH_GPIO_Port, SWITCH_Pin);
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);
}
}
}