stm32常用功能配置逻辑总结_关于stm32的配置总结
stm32常用功能配置逻辑总结由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“关于stm32的配置总结”。
STM32配置逻辑
1、RCC配置
缺省RCC寄存器—选择时钟源—设置高低速AHB时钟分频—设置ADC时钟—使能锁相环时钟—将锁相环设置为系统时钟—打开使用到的外部时钟
Rcc子函数编写
Void RCC_Configuation();{
定义错误变量
ErrorStatus HSEStartUpStatus;
初始化RCC外部寄存器
RCC_Deinit();
打开外部高速晶振
RCC_HSEConfig(RCC_HSE_ON)
等待外部高速晶振准备好
HSEStuartUpStatus=RCC_WaitForHSEStuartUp;
判断是否起振
if(HSEStuartUpStuartUpStatus==SUCCES)
{
使能FLASH预读取缓冲区
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable)
设置FLASH_Latency延时周期
FLASH_SetLatency(FLASH_Latency_x)
配置高速总线AHB时钟
RCC_HCLKConfig(RCC_SYSCLK_DIVx);
配置低总线APB2时钟
RCC_PCLK2Config(RCC_HCLK_Divx);
配置低总线APB1时钟
RCC_PCLK1Config(RCC_HCLK_Divx);
配置ADC外部时钟
RCC_ADCCLKConfig(RCC_PCLK2_Divx);
配置锁相环PLL时钟源及倍频
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9)
使能锁相环时钟
RCC_PLLCmd(ENABLE);
等待PLL时钟稳定输出
While(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
将锁相环设置为系统时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
等待校验成功
While(RCC_GetSYSCLKSource()!=0x08);} 打开使用到的外部时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE, ENABLE);}
2、GPIO的配置
Rcc设置——gpio配置——led操作——while(1)
主函数说明
#include “stm32f10x_lib.h” 主函数
int main(void){ 时钟配置
void RCC_Configuration(void);
IO口初始化
void GPIO_Configuration(void){
定义结构
GPIO_InitTypeDef GPIO_InitStructure;
选择引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x | GPIO_Pin_x;
所选引脚频率
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_xMHz;所选引脚模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;初始化配置
GPIO_Init(GPIOx , &GPIO_InitStructure);} while(1){
置位引脚
GPIO_SetBits(GPIOA , GPIO_Pin_2);GPIO_SetBits(GPIOA , GPIO_Pin_3);Delay(n);清零引脚
GPIO_ResetBits(GPIOA , GPIO_Pin_2);GPIO_ResetBits(GPIOA , GPIO_Pin_3);Delay(n);} }
3、EXTI配置规则
配置时钟→初始化IO口→配置中端向量优先级→指定中断IO口→中断方式→使能中断→写中断函数
主函数
Void main(void){
开启用到的外设时钟 Void RCC_Configuation();
初始化IO口
Void IO_Configuation();中断设置
Void EXTI_Configuation()
{
定义结构变量
EXTI_InitTypeDef EXTI_InitStructure;
清除中断标志
EXTI_ClearPendingBit(EXTI_Linex);
选择中断管脚
GPIO_EXTILineConfig(GPIO_PortSourceGPIOx,GPIO_PinSourcex)
选择中段线路
EXTI_InitStructure.EXTI_Line(EXTI_Linex);
中断模式
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
中断触发方式
EXTI_InitStructure.EXTI_Trigger=EXTI_Teigger_Rising_Falling;
中段线路使能
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
初始化设置
EXTI_Init(&EXTI_InitStucture);} 配置中断向量优先级
Void NVIC_Configuation()
{ 定义结构(只定义一次)
NVIC_InitTypeDef NVIC_InitStructure;选择中断分组(选择一次)
NVIC_PriorityGroupConfig(NVIC_Priority_group_x);选择中断通道
NVIC_InitStructure.NVIC_IRQChannel=EXTIx_IRQChannel;抢占式中断优先级设置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=x;响应式中断优先级设置
NVIC_InitStructure.NVIC_IRQChannelSubPriority=x;
使能中断
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;初始化设置
NVIC_Init(&NVIC_InitStruction);} 死循环 While(1);} 中断函数
Void EXTIx_IRQHandler(voie){ 点亮LED GPIO_SetBits(GPIOx,GPIO_Pin_x);清除中断标志
EXTI_ClearITPendingBit(EXTI_Linex);}
4、通用TIM配置规则
开启时钟→设置中断向量→引脚初始化→设置TIM_Cfg→开启TIM→中断函数
主函数
Void main(){ 开启时钟
RCC_Configuation(){
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);} 设置中断向量
NVIC_Configuation()
{
NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);} IO口初始化
GPIO_Configuation(){
GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB,&GPIO_InitStructure);} TIM设置
TIMER_Configuation(){
定义结构变量
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
缺省TIMER配置
TIM_DeInit(TIMx);
设置TIM时钟源
TIM_InternalClockConfig(TIMx)
设置预分频系数
TIM_TimeBaseStructure.TIM_Prescaler=3600-1;
设置时钟分割采样分频
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIVx;
设置计数器计数模式
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
设置匹配次数
TIM_TimeBaseStructure.TIM_Period=2000-1;
初始化设置
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
清除溢出中断标志
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
禁止ARR预装在缓冲器
TIM_ARRPreloadConfig(TIM2,DISABLE)
开启TIM2中断
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE)} TIM_Cmd(TIM2,ENABLE);While(1);} 中断函数
Void TIM2_IRQHandler(void){ u8 ReadValue;if(TIM_GetITStatus(TIM2, TIM_IT_Update)!= RESET){ 清除TIM2的中断待处理位
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);将PB.5管脚输出数值写入ReadValue ReadValue = GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5);if(ReadValue == 0)GPIO_SetBits(GPIOB,GPIO_Pin_5);else GPIO_ResetBits(GPIOB,GPIO_Pin_5);} }