【蓝桥杯嵌入式】比赛笔记(2)根据固件库快速配置各模块初始化
因为蓝桥杯比赛时间很短,并且如果自己去记忆各模块初始化的话,也难免有问题,所以这里给出一个通过固件库的快速初始化模块的方法。
比赛提供固件库的:
目录
GPIO(LED KEY BUZZ)
位置
…\赛点资源数据包_嵌入式_2019\6-STM32固件库代码V3.5版\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\GPIO\IOToggle\main.c
有用的地方
注意
- 需要修改为要初始化的输入引脚,如果是KEY按键的GPIO的话,GPIO_MODE选择
GPIO_Mode_IPU;
- 需要注意初始化BUZZ时,注意加这两行代码:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
GPIO_Init(GPIOB, &GPIO_InitStructure);//¸ü¸ÄËäÓÐJTAGÒý½Å״̬
RTC
位置
…\赛点资源数据包_嵌入式_2019\6-STM32固件库代码V3.5版\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\RTC\LSI_Calib
有用的地方
RTC初始化配置
并把红框内部分修改为:
RTC_SetCounter(HH*3600+MM*60+SS);
RTC_WaitForLastTask();
时间显示函数
把红框中的printf改为sprintf,并加入一行LCD显示函数。
中断配置
中断函数
在main.c文件夹的stm32f10x_it.c中
删除红框行
主函数显示
显示的话参考main.c中的Time_Show()的while循环
LCD修改
LCD直接使用官方提供的lcd.c和lcd.h就行,但是在运行LCD代码时,会干扰LED也发生反转,这时需要在LCD.c的LCD_WriteReg(),LCD_WriteRAM_Prepare(),LCD_WriteRAM()
三个函数中,函数第一行加上"unsigned short PCOUT=GPIOC->ODR;
",最后一行加上"GPIOC->ODR=PCOUT;
",用于锁存M74HC573M1R
TIM_Base
位置
…\赛点资源数据包_嵌入式_2019\6-STM32固件库代码V3.5\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\TIM\TimeBase
有用的地方
配置TIM
复制void NVIC_Configuration(void)
和RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
时情况修改RCC时钟。
在主函数中:
98到130行的配置通道的不需要,同时修改预分频值和TIM_ITConfig()函数,改为:TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);
同时别忘加上一行:TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC配置
复制main.c中的:
记得修改中断通道为使用的部分。
中断服务函数配置
这个就别复制了。。有点麻烦,直接记一下吧:
void TIM3_IRQHandler(void)
{
if(TIM_GetFlagStatus(TIM3,TIM_FLAG_Update) == SET){
//Çå³ý±ê־λ
TIM_ClearFlag(TIM3,TIM_FLAG_Update);
//
}
}
TIM_PWM
位置
…赛点资源数据包_嵌入式_2019\6-STM32固件库代码V3.5\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\TIM\7PWM_Output
注意,是7PWM_Output这个文件夹!!
有用的地方
PWM定时器配置
main.c中
黄框内设置为自己想要的频率,例如若填入999,则为1KHz
记得在代码前面添加开启相关时钟,以及定义结构体代码
以及预分频设置代码
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//TIM2预分频设置:1MHZ,APB1分频系数2,输入到TIM3时钟为36MHzx2 = 72MHz
TIM_PrescalerConfig(TIM2,71, TIM_PSCReloadMode_Immediate);
Channel2Pulse等为自己定义的变量(uint_8)类型的
PWM输出管脚配置
这个记得输出模式是GPIO_Mode_AF_PP
就行
EXTI配置
位置
…\赛点资源数据包_嵌入式_2019\6-STM32固件库代码V3.5版\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\EXTI\EXTI_Config
有用的地方
EXTI配置
main.c函数中的void EXTI0_Config(void)
和void EXTI9_5_Config(void)
直接复制到自己工程中的EXTI_Config()函数中:
黄框部分按照要求改;然后注意初始化引脚的修改,蓝桥杯板子上,对应的这两个中断是PA0 PA8,就行了
记得在代码中加入:
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
中断函数部分
打开stm32f10x_it.c文件:
红框部分删除即可,最后效果应该这样:
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
EXTI_Status = 1;
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
/**
* @brief This function handles EXTI9_5 interrupt request.
* @param None
* @retval None
*/
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line8) != RESET)
{
EXTI_Status = 2;
EXTI_ClearITPendingBit(EXTI_Line8);
}
}
EXTI_Status是在主函数中定义的一个flag作用的变量,用来查看是哪个按键被按下。
ADC
位置
…\赛点资源数据包_嵌入式_2019\6-STM32固件库代码V3.5版\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\ADC\AnalogWatchdog
有用的地方
配置ADC
main.c中。黄框为需要修改的地方,红框为删除的地方,ADC通道一般使用8蓝桥杯的ADC_Channel_8
,对于是否允许连续转换的地方,官网给的是不允许,但是允许也行,我不太明白为啥,欢迎评论区留言
记得添加代码(时钟和定义结构体)
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
引脚配置
记得模式选择GPIO_Mode_AIN
就行,引脚为PB0。
读ADC函数
这个就得自己写了:
float Read_ADC(void)
{
float ADC_VALUE;
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==0);
ADC_VALUE = ADC_GetConversionValue(ADC1)*3.30/0xfff;
ADC_SoftwareStartConvCmd(ADC1,DISABLE);
return ADC_VALUE;
}
可以写一个读ADC的标记位,然后配置Systick中断。
USART
位置
…\赛点资源数据包_嵌入式_2019\6-STM32固件库代码V3.5版\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\USART\Interrupt
有用的地方
串口配置
首先复制main.c的主函数中:
除了被红线划掉的代码,然后再去GPIO_Configuration();
中,主要参考他RX引脚配置GPIO_Mode_IN_FLOATING
,TX引脚配置GPIO_Mode_AF_PP
以下代码参考主要
然后记得在代码前加上:
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
2021年4月3日17:18:27