按键扫描函数同以前的一样不必多讲 主要是讲解IO口作为输入口的设置: GPIO通用设置
GPIO_Set函数的前两个参数是用于来定位具体的哪一个IO口的,第三个参数是设置输入输出模式的
按键是普通输入模式,第四第五参数是与输出有关的,写为0即可,最后一个参数设置需要看按键按下是高电平则设置为下拉,按键按下是低电平则设置为上拉。
串口实验:
串口初始化函数参数:第一个是APB2的时钟PCLK2。第二个是波特率,不用多说 uart_init(84,115200);
时钟设置:需要设置两个时钟,一个相应外设的时钟,一个是对应的IO口的时钟。
APB2的时钟PCLK2的设置,默认系统SYSCLK=168时候APB2=84MHz 设置需要自己配置寄存器(自己测试) RCC_CFGR寄存器设置:
[15:13]APB2(高速)从PHB而来,可以设置自己的分频(1,2,4,8,16)最高84MHz,系统默认是不分频
[12:10]APB1(低速)从PHB而来,可以设置自己的分频(1,2,4,8,16)最高42MHz,系统默认是不分频
[7:4]AHB从SYSCLK而来,可以设置自己的分频(1,2,4,8,16,64,128,236,512)当使用以太网时候AHB时钟至少为25MHz
在系统时钟分设置时候早已经将APB2设置为2分配,PHB不分频,APB1设置为4分频
IO口设置分为通用设置和复用设置 GPIO设置 :
GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);
设置相应的功能:设置为推挽上拉输出,且为复用模式 复用输出GPIO_AF_Set(GPIOA,9,7);
前两个参数是定位IO口,后面一个参数是定位属于哪一中复用
AF0:MCO/SWD/SWCLK/RTC AF1:TIM1/TIM2;
AF2:TIM3~5; AF3:TIM8~11
AF4:I2C1~I2C3; AF5:SPI1/SPI2; AF6:SPI3; AF7:USART1~3;
AF8:USART4~6; AF9:CAN1/CAN2/TIM12~14 AF10:USB_OTG/USB_HS AF11:ETH
AF12:FSMC/SDIO/OTG/HS AF13:DCIM AF14: AF15:EVENTOUT 串口中断设置:
MY_NVIC_Init(NVIC_PreemptionPriority,NVIC_SubPriority,NVIC_Channel, NVIC_Group) 4个参数:分别是 抢占优先级数: 响应优先级数:
中断编号:在顶层头文件stm32f4xx.h中包含定义是一个枚举类型:IRQn类型数据
中断分组:0~4组
//组0:0位抢占优先级,4位响应优先级 //组1: 1位抢占优先级,3位响应优先级 //组2: 2位抢占优先级,2位响应优先级 //组3: 3位抢占优先级,1位响应优先级 //组4: 4位抢占优先级,0位响应优先级
串口发送时候可以正常使用printf函数,同以前学习的C语言一样使用,注意一点是换行必须是\\r\\n一起使用才行。 外部中断使用:
外部中断分两部分,初始化与中断服务程序的编写 初始化:
第一步:外部中断一般必须要与按键输入一起使用,所以外部中断必须有与按键一样的IO初始化,直接照搬过来即可 第二步:中端口映射与触发设置(包括开启中断) Ex_NVIC_Config(GPIO_E,2,FTIR);
参数1与参数2是选择映射的IO口,参数3是触发模式:FTIR=1标示下降沿触发,RTIR=2标示上升沿 3标示任意沿
注意该函数一次调用只能设置一个IO口,多个口需要多次调用 第三步:设置中断分组优先级以及终端号(包括是使能中断) MY_NVIC_Init(NVIC_PreemptionPriority,NVIC_SubPriority,NVIC_Channel, NVIC_Group) 该函数同上,串口处已经讲过 中断服务函数部分:
void EXTI0_IRQHandler(void) {
delay_ms(10); if(WK_UP==1) {
BEEP=!BEEP;
}
EXTI->PR=1<<0; //
}
中断服务程序是一个函数,该函数的函数名是一个固定的,叫做中断向量,定义在启动文件startup_stm32f40_41xxx.s中,已经被定义好了,不能随便定义。所有的中断服务程序函数名都在这里被定义了。用的时候去选用就行了。注意外部中断的0~4外部中断是每一个单独的外部中断,5~9公用一个中断服务程序:EXTI9_5_IRQHandler 10~15公用:EXTI15_10_IRQHandler
中断服务函数执行完毕前要清除中断标志:EXTI->PR=1<<0;
请标志是在相应的寄存器(挂起寄存器Pending Register)的相应为置1,而不是清零
当中断公用一个中断服务函数时候如何进行区分:
可以在中断服务程序里检测判断:通道读取各个中断对应的IO口的状态进行判断。