这里我设置的是开关接低电平时,LED亮灯;接高电平时,LED灭灯
若点击 Manage embedded software packages 后,出现失败,则需要随便点击其它任一选项,进行下载一些文件,比如点击 file->new project ,等下载后,在进行安装固件库。
选择自己开发板的固件库,我这里是f1的。选择版本安装,我这里已经安装过了。
file
-> new project
建立工程如果你使用串口烧录程序,那建议你必须选一个,否则很有可能你只能烧录一次。
SW模式就选择serial Wire。JTAG模式就选择JTAG,4pin和5pin的区别多了一个复位引脚
stlink调试就是SW模式,jlink调试就是JTAG模式
第二个LSE(低速时钟)可以不设置,图上我设置了第二个,实际我取消了这个设置,设置了不影响。
BYPASS Clock Source(旁路时钟源)
Crystal/Ceramic Resonator(石英/陶瓷 晶振)
- 2.选择外部时钟HSE 8MHz
- 3.PLL锁相环倍频9倍(8*9=72)
- 4.系统时钟来源选择为PLL
- 5.设置APB1分频器为 /2
先返回 PINout&Config 选项界面,进行端口设置。
我使用 PA1
作为led管脚, 将端口设置位 GPIO_Output. 输出模式
使用PB1
作为开关管脚(本次按题目要求用杜邦线模拟开关),将端口设置位 GPIO_EXTI1. 中断模式
左键单击引脚即可进行选择
当设置完后,可以选择System Core下拉栏中的 GPIO,进行查看引脚设置
GPIO output level:有low和high两种选择,一般选择low
GPIO mode:推挽输出和开漏输出两者模式,两者模式的区别在于推挽输出中1代表VCC,0表示GND;开漏输出中1代表高阻态,0代表GND。
GPIO Pull-up/Pull-down:输入需要上下拉,输出一般没有上下拉
Maxinum output speed:最大的输出速度,一般选择low就可以了。
- 配置高速:输出频率高,噪音大,功耗高; (如 配置SPI、CAN引脚,要求通信稳定,速度过低会造成输出失真、通信异常。
- 配置低速:输出频率低,噪音小,功耗低,提高系统EMI(电磁干扰)性能;(低功耗产品会选择低)实际应用中,满足要求的情况下就低不就高。
User Label: 用户标签 给引脚设置名称
管脚 PA1 即GPIO_Output模式中的 User Label 可以 更改为 A1_led
接下来查看管脚 PB1 即 GPIO_EXTI1中断模式
GPIO mode:
- External Interrupt Mode with Rising edge trigger detection 上升沿触发外部中断
- External Interrupt Mode with Falling edge trigger detection 下降沿触发外部中断
- External lnterrupt Mode with Rising/Falling edge trigger detection 上升/下降沿触发外部中断
- External Event Mode with Rising edge trigger detection 上升沿触发外部事件
- External Event Mode with Falling edge trigger detection 下降沿触发外部事件
- External Event Mode with Rising/Falling edge trigger detection 上升/下降沿触发外部中断
GPIO Pull-up/Pull-down: 上下拉电阻
User Label: 用户标签 给引脚设置名称
这里开关管脚 PB1
GPIO mode 设置成 下降沿触发外部中断
GPIO Pull-up/Pull-down 设置成 上拉电阻 pull-up 确保其不接低电平时,电平为1,避免未知状态。
User Label:设置成 B1_EXTI
勾选 EXTI line1 interrupt
Preemption Priority:抢占优先级
Sub Priority:响应优先级
STM32的抢占优先级和响应优先级_qlexcel的专栏-CSDN博客_抢占优先级和响应优先级
如果你要在中断回调函数中使用
HAL_Delay()
,那么System tick timer的优先级就要大于EXTI line的优先级
不管工程名称还是路径都不要有中文,否则后面编译文件会出错。
Project Name:工程名称
Project Location:点击后面的"Browse"选择你想要将生成的工程保存到哪个目录里面。
Application Structure:应用程序结构
- Basic:是基础的结构,一般不包含中间件(RTOS、文件系统、USB设备等)
- Advanced:相反就是包含中间件,一般针对相对复杂一点的工程。
Toolchain/IDE:根据你用的编译软件进行选择 使用KEIL就选择keil的对应版本。
其他默认。
copy all used libraries into the project folder:复制所有库文件(不管工程需要用到还是没用到)到生成的工程目录中,此做法可以使在不使用Cubemx或者电脑没有安装cubemx,依然可以按照标准库的编程习惯调用HAL库函数进行程序编写。
Copy only the necessary library files: 只复制必要的库文件。这个相比上一个减少了很多文件。比如你没有使用CAN、SPI…等外设,就不会拷贝相关库文件到你工程下。
Add necessary library files as reference in the toolchain project configuration file :在工具链项目配置文件中添加必要的库文件作为参考。这里没有复制HAL库文件,只添加了必要文件(如main.c)。相比上面,没有Drivers相关文件。
Generate peripheral initialization as a pair of’.c/.h’ files per peripheral:每个外设生成独立的.C .H文件,方便独立管理。不勾:所有初始化代码都生成在main.c 勾选:初始化代码生成在对应的外设文件。 如UART初始化代码生成在uart.c中。
Backup previously generated files when re-generating:在重新生成时备份以前生成的文件。重新生成代码时,会在相关目录中生成一个Backup文件夹,将之前源文件拷贝到其中。
keep user code when re-generating:重新生成代码时,保留用户代码(前提是代码写在规定的位置。也就是生成工程文件中的BEGIN和END之间。否则同样会删除。后面会根据生成的工程进行说明)
delete previously generated files when not re-generated:删除以前生成但现在没有选择生成的文件 比如:之前生成了led.c,现在重新配置没有led.c,则会删除之前的led.c文件。(此功能根据自身要求进行取舍)
打开 main.c 文件,在main函数后面添加中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if( GPIO_Pin == B1_EXTI_Pin) //判断中断源
{
HAL_GPIO_TogglePin(GPIOA, A1_led_Pin); //翻转led管脚 A1口的电平
}
}
编译程序,然后下载或烧录程序。
PB1接地,PA1的 led灯亮
PB1不接,因为设置了上拉电阻所以默认为高,PA1的 led灯灭