蜂鸣器:
蜂鸣器硬件连接为PF8,正常工作为高电平启动。
按键:
复位键为硬件连接为PA0、k1/k2为PE3/PE2。
注:按键模式为输入模式。
按键检测函数:
u8 KEY_Scan(u8 mode)//mode 0:不支持连续按 1:支持连续按
{
static u8 key_up=1;
if(mode==1) key_up=1;//支持连续按
if(key_up && KEY按下)
{
delay_ms(10);//延时,防抖
key_up=0;//标记这次key已经按下
if(KEY确实按下)
{
return KEY_VALUE;
}
}else if(KEY没有按下) key_up=1;
return 没有按下;
}
时钟系统:
LSIRC(32kHz):低速内部时钟
LSEOSC(32.768kHz):低速外部时钟
HSE OSC(4-26MHz):高速外部时钟
HSI RC(16MHz):低速内部时钟
PLLCLK(最高168MHz):系统时钟
PLLP = 8MHz * N / ( M * P )
STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。
①、HSI是高速内部时钟,RC振荡器,频率为16MHz,精度不高。可以直接作为系统时钟或者用作PLL时钟输入。
②、HSE是高速外部时钟,频率范围为4MHz~26MHz。
③、LSI是低速内部时钟,RC振荡器,频率为32kHz,提供低功耗时钟。主要供独立看门狗和自动唤醒单元使用。
④、LSE是低速外部时钟,接频率为32.768kHz。RTC
⑤、PLL为锁相环倍频输出。STM32F4有两个PLL:
主PLL(PLL)由HSE或者HSI提供时钟信号,并具有两个不同的输出时钟。第一个输出PLLP用于生成高速的系统时钟(最高168MHz)。第二个输出PLLQ用于生成USB OTG FS的时(48MHz),随机数发生器的时钟和SDIO时钟。2.系统时钟SYSCLK可来源于三个时钟源:
①、HSI振荡器时钟
②、HSE振荡器时钟
③、PLL时钟
STM32F4时钟信号输出MCO1(PA8)和MCO2(PC9)。(MCO最大输出时钟不超过100MHz)。
RCC_APBxPeriphClockCmd();//外设时钟使能
RCC_HSEConfig();//时钟源使能
RCC_APB1PeriphResetCmd();//外设复位;
RCC_GetFlagStatus();//状态参数获取
Systick定时器:
Systick定时器常用来做延时,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常。
SysTick 控制和状态寄存器- CTRL: 配置函数:SysTick_CLKSourceConfig();
固件库中的Systick相关函数:
SysTick_CLKSourceConfig()//Systick时钟源选择 misc.c文件中
SysTick_Config(uint32_t ticks)
//初始化systick,时钟为HCLK,并开启中断core_cm4.h文件中
中断服务函数:
void SysTick_Handler(void);
端口复用:
AFRL寄存器,32位,四位二进制数选择一位AF0~AF15;
注:在使用端口复用时,注意模式设置为复用模式:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用模式
NVIC中断优先级分组:
分组配置是在寄存器SCB->AIRCR中配置:
组 AIRCR[10:8]IP bit[7:4]分配情况 分配结果
0 111 0:4 0位抢占优先级, 4位响应优先级
1 110 1:3 1位抢占优先级,3位响应优先级
2 101 2:2 2位抢占优先级,2位响应优先级
3 100 3:1 3位抢占优先级,1位响应优先级
4 011 4:0 4位抢占优先级,0位响应优先级
抢占优先级 & 响应优先级区别:
1、高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
2、抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
3、抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
4、如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
中断优先级分组函数:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
注:数值越小优先级越高。一般情况下,系统代码执行过程中,只设置一次中断优先级分组。
中断优先级设置步骤:
1、系统运行后先设置中断优先级分组。调用函数:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)整个系统执行过程中,只设置一次中断分组。
2、针对每个中断,设置对应的抢占优先级和响应优先级:
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);