【蓝桥杯嵌入式】比赛笔记(2)根据固件库快速配置各模块初始化

【蓝桥杯嵌入式】比赛笔记(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

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瞲_大河弯弯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值