蓝桥杯赛前准备(二)配置篇
(参考往届)
我上网查了很多资料,也看了很多篇博客,赛前需要基本掌握的操作有几个,其中有GPIO、LED、ADC、PWM、LCD(比赛会给例程)、E²P ROM、BUTTON、中断以及时钟的配置,所以呢,这篇文章会总结一下以上有关IO口配置的操作。
(实物图)
此图为CT117E竞赛板的各个基本模块分布。
各位在观看之前最好事先熟悉好蓝桥杯嵌入式开发的CT117E板子上的外设,最好还要了解扩展板的内容。(扩展板本文章不做说明)
本文章以库函数版本为例,给大家讲解一部分模块的配置。
- 因为你使用各个模块都要启用时钟嘛,为了节省时间跟减去不必要的麻烦,所以我会一开始就使能APB2的四个时钟,分别是GPIOA,GPIOB,GPIOC,GPIO4。(这种操作仅限于比赛,平时还望各位正常配置)
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, ENABLE);
还有在要添加三个结构体,方便后面的配置。
(引脚、ADC采集、串口)
GPIO_InitTypeDef GPIO_InitStruct;
ADC_InitTypeDef ADC_InitStruct;
USART_InitTypeDef USART_InitStruct;
- 注意LCD,官方会给出例程,你只需理解程序就好(当然你也可以自己配置)我是根据官方给出的例程直接使用,因为这说一个有时间限制的考试,只有五个小时,各位也可以权衡一下时间,在main函数里面我是这样配置的
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
- LED灯的配置有一点是需要注意的,因为LED灯的部分引脚跟LCD是公用的,所以不可以像平时一样配置引脚,但是这也不是意味着LED灯不能使用了,因为LED灯连上了74HC573锁 存器。当N_LE(PD2)引脚为高电平时,H_D0~H_D7的电平信号可以直接传到右端给到LED,如果N_LE(PD2)引脚为低电平的时候,无论H_D0~H_D7的电平信号如何改变,74HC573锁存器右端的电平信号都不会改变。简单来理解的话,就是单独使能PD2这个引脚,当PD2为高电平时,PC8-15的电平会控制LED,但是PD2为低时则对LED不会有任何影响。所以在LED方面的配置为
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed= GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed= GPIO_Speed_2MHz;
GPIO_Init(GPIOD, &GPIO_InitStruct);
GPIO_SetBits(GPIOD, GPIO_Pin_2);
GPIO_SetBits(GPIOC, GPIO_Pin_All);
GPIO_ResetBits(GPIOD, GPIO_Pin_2);
- 接下来为BUTTON(按钮),四个按键B1,B2,B3,B4分别对应的引脚为PA0,PA8,PB1,PB2。须记住,按下的时候,电平为低。
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOB, &GPIO_InitStruct);
- ADC采集配置,配置引脚为PB8
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode= GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStruct);
ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;
ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStruct.ADC_ExternalTrigConv = DISABLE;
ADC_InitStruct.ADC_NbrOfChannel = 1;
ADC_InitStruct.ADC_ScanConvMode = DISABLE;
ADC_Init(ADC1, &ADC_InitStruct);
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_13Cycles5);
ADC_ITConfig(ADC1,ADC_IT_AWD,ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
- USART配置,PA2设置为串口发送引脚,PA3为串口接收引脚。
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2; //tx
GPIO_InitStruct.GPIO_Mode= GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3; //rx
GPIO_InitStruct.GPIO_Mode= GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStruct);
USART_InitStruct.USART_BaudRate = 115200;
USART_InitStruct.USART_HardwareFlowControl =USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode= USART_Mode_Rx|USART_Mode_Tx;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_StopBits =USART_StopBits_1;
USART_InitStruct.USART_WordLength =USART_WordLength_8b;
USART_Init(USART2, &USART_InitStruct);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
USART_Cmd(USART2, ENABLE);
NVIC_Config(); //优先级配置
/*******************************************************/
NVIC_Config();函数如下
void NVIC_Config()
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStruct.NVIC_IRQChannel=USART2_IRQn; //38也可以
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);
}
CT117E板子上有个引脚对应的模块
本次文章仅限于某部分的IO口的配置操作,大家配置的时候最好参考STM32F103RBT6的芯片手册以及其库函数进行配置,不要一味的看例程,要自己手动写。
总结下来之后的代码如下图