第八届蓝桥杯大赛(嵌入式组)

    蓝桥杯的嵌入式组是Stm32rbt6单片机的编程比赛,我想对于学习电子信息工程专业的同学这不是一个陌生的名词,如果你是电信专业的大四同学却没有听说过msp430或者stm32,或许你应该审视一下自己是否懈怠了4年时光,不过一般大四的同学是看不见我这篇文章的。看到这篇文章的人大多是要参加这个比赛的同学,我在上次比赛中只获得了国二,差一丢丢国一这是非常令人遗憾的事情,我会在接下来的文章中介绍我的经验,和产生遗憾的原因。
  • 竞赛板介绍

  • 竞赛板使用经验

  • 部分外设的配置

  • 要求熟练掌握的知识

  • 错失国一的自我反省

  • 客观题部分


竞赛板介绍

  • 图片展示

  • 介绍
    第一块板子是主板,第二块是扩展板,他们的资料可以通过加蓝桥杯嵌入式相关的QQ群中去下载,有空的话我也可以分享出来。

竞赛板使用经验

①下载程序并不是使用Stlink或者Jlink,而是CooCox
②使用蜂鸣器的时候是需要将PB4短接帽接上,而一般正常使用时是不可短接PB4的,否则无法下载程序。理由我就不细说了,PB4的主要功能是J-RST其复用功能才是普通IO口,我会在后面附上蜂鸣器的相关配置。

部分外设的配置

  • 在此之前我还是希望对读者的基础知识有一点小小的要求
    1.C语言功底至少在结构体之后链表之前即可。
    2.熟悉Uart,SPI,I2C三种基础通信协议(我这里的熟悉是指SPI和I2C能够盲打)

时钟配置

用到哪些外设就开启对应时钟,注意APB1和APB2所对应的外设

void RCC_Configuration(void)
{
/* TIM clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
/* GPIO clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);
}

GPIO配置

用多少添加多少

void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;/* GPIOC Configuration:Pin6, 7, 8 and 9 as alternate function push-pull */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8  ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2  ;    //BUTTONGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2  ;      //UASRT2T
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//  GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3  ;    //UASRT2RGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin =  0XFF00  ;    //LEDGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2  ;    //LEDGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0  ;    //adcGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4  ;    //BEERGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2  ;  //CAPGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7  ; //PWM_OUTGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);
}

中断配置

哪些外设需要使用中断就在此处开启,用多少开多少

void NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;/* Enable the TIM2 global Interrupt */NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;             //BUTTONNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority =5;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;           //USART2NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;             //RTCNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;            //CaptureNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;            //PWM_OUTNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);} 

LED灯的配置

有两处,一处是IO口的配置,一处是LED的控制

void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin =  0XFF00 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void LED_Set( u8 data )
{
GPIOD->ODR |= GPIO_Pin_2;
GPIOC->ODR = ~(data<<8);
GPIOD->ODR &= ~GPIO_Pin_2;
}

按键扫描(非阻塞)

 void BUTTON_Config(void)
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period = 10000;TIM_TimeBaseStructure.TIM_Prescaler = 72-1;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);/* TIM IT enable */TIM_ITConfig(TIM4, TIM_IT_Update , ENABLE);/* TIM4 enable counter */TIM_Cmd(TIM4, ENABLE);
}#define PORTA (GPIOA->IDR)#define PORTB (GPIOB->IDR)#define BUTTON_1 GPIO_Pin_0#define BUTTON_2 GPIO_Pin_8#define BUTTON_3 GPIO_Pin_1#define BUTTON_4 GPIO_Pin_2u8 button_delay = 0;u8 button_sure_flog = 0;void TIM4_IRQHandler(void)
{if(button_delay)button_delay--;else{if( (PORTA&(BUTTON_1|BUTTON_2))!= (BUTTON_1|BUTTON_2) ||(PORTB&(BUTTON_3|BUTTON_4))!= (BUTTON_3|BUTTON_4)   ){if( button_sure_flog==0 )button_sure_flog=1;else{button_sure_flog=0;if( (PORTA&BUTTON_1)==0 )  //B1{//按下B1所执行的操作}if( (PORTA&BUTTON_2)==0 )  //B2{//按下B2所执行的操作}if( (PORTB&BUTTON_3)==0 )  //B3{//按下B3所执行的操作}if( (PORTB&BUTTON_4)==0 )  //B4{//按下B4所执行的操作}button_delay = 20;}}else button_sure_flog=0;}TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
}

AT24C02读写

使用了i2c.h 就不用写i2c的基础驱动

void W_EEPROM( u8 addr ,u8 data ) //指定地址写数据
{u32 i=0x10000;I2CStart( );I2CSendByte(0xa0);I2CWaitAck( );I2CSendByte(addr);I2CWaitAck( );I2CSendByte(data);I2CWaitAck( );I2CStop( );while(i--);
}u8 R_EEPROM( u8 addr )  //指定地址读数据
{u32 i=0x10000;u8 data=0;I2CStart( );I2CSendByte(0xa0);I2CWaitAck( );I2CSendByte(addr);I2CWaitAck( );I2CStart( );I2CSendByte(0xa1);I2CWaitAck( );data = I2CReceiveByte();I2CSendNotAck( );I2CStop( );while(i--);return data;
}

ADC的配置

此外还需要开启ADC的RCC时钟和IO口配置为模拟输入,这些都应该在GPIO_config中完成

void ADC_Config(void)
{ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode = ENABLE;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC_InitStructure);/* ADC1 regular channel14 configuration */ ADC_RegularChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_5Cycles5);/* Enable ADC1 */ADC_Cmd(ADC1, ENABLE);/* Enable ADC1 reset calibration register */   ADC_ResetCalibration(ADC1);/* Check the end of ADC1 reset calibration register */while(ADC_GetResetCalibrationStatus(ADC1));/* Start ADC1 calibration */ADC_StartCalibration(ADC1);/* Check the end of ADC1 calibration */while(ADC_GetCalibrationStatus(ADC1));/* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}u16 Get_ADC_Data(void)
{u8 i=10;u16 Result=0;while(i--){ADC_ClearFlag(ADC1, ADC_FLAG_EOC);while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET);Result+=ADC_GetConversionValue(ADC1);}return Result/10;
}

USART2的printf输出

除开还差对应的时钟和IO口配置外,还应包含头文件 stdio.h
看到下面的代码你可能会疑惑我怎么写出来的,答案是从3.5标准库中的历程复制出来加以修改的,参加蓝桥杯的同学要必须做到非常熟练的从3.5库历程中复制想要的代码

#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ *//* Private functions ---------------------------------*/
/*** @brief  Retargets the C library printf function to the USART.* @param  None* @retval None*/
#define EVAL_COM1 USART2PUTCHAR_PROTOTYPE
{/* Place your implementation of fputc here *//* e.g. write a character to the USART */USART_SendData(EVAL_COM1, (uint8_t) ch);/* Loop until the end of transmission */while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET){}return ch;
}void UART_Config(u32 BaudRate)
{USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = BaudRate;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART2, &USART_InitStructure);USART_Cmd(USART2, ENABLE);USART_ITConfig(USART2, USART_IT_RXNE,  ENABLE);
}u8 RECV_BUFF[30];
u8 RECV_CNT = 0;
u8 RECV_SUCCESS_FLOG = 0;void USART2_IRQHandler(void)
{//可在此处编写UART收到数据后对数据的操作,别告诉我你不知道数据在哪里USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}

PWM输出

PWM输出是比赛的重点和难点,我希望你们对捕获比较寄存器有较为深刻的理解,我的这个仅供参考

void PWM_Out_Config(void)
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;  /* Time base configuration */TIM_TimeBaseStructure.TIM_Period = 65535;TIM_TimeBaseStructure.TIM_Prescaler = 36;    //0.5us +1TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);/* Output Compare Toggle Mode configuration: Channel1 */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 1000;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OC1Init(TIM3, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);/* Output Compare Toggle Mode configuration: Channel2 */TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 1000;TIM_OC2Init(TIM3, &TIM_OCInitStructure);//CCRx的值在改动后立刻生效/* TIM enable counter */TIM_Cmd(TIM3, ENABLE);/* TIM IT enable */TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2 , ENABLE);
}u16 Out_Freq_Ch1 = 1000;   //(单位us)
u16 Out_Freq_Ch2 = 1000;void TIM3_IRQHandler(void)  //波形输出
{if(TIM_GetITStatus(TIM3, TIM_IT_CC1)!=RESET){(TIM3->CCR1)+=Out_Freq_Ch1;  TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);   }if(TIM_GetITStatus(TIM3, TIM_IT_CC2)!=RESET){(TIM3->CCR2)+=Out_Freq_Ch2;   TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);   }
}void Ch1_Out_Pwm_Set( u32 Freq_ch1 ,u8 Out_Status )  //输入的单位就是HZ
{GPIO_InitTypeDef GPIO_InitStructure;Out_Freq_Ch1 = (1000000/(Freq_ch1))-10;      //配置频率参数GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 ;    //PWM_OUTif(Out_Status==0){TIM_ITConfig(TIM3, TIM_IT_CC1, DISABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIOA->ODR &= ~GPIO_Pin_6 ;    //输出低电平}else{TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF_PP ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);  //翻转输出}
}void Ch2_Out_Pwm_Set( u32 Freq_ch2 ,u8 Out_Status )  //单位HZ
{GPIO_InitTypeDef GPIO_InitStructure;Out_Freq_Ch2 = (1000000/(Freq_ch2))-10;      //配置频率参数GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7 ;    //PWM_OUTif(Out_Status==0){TIM_ITConfig(TIM3, TIM_IT_CC2, DISABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIOA->ODR &= ~GPIO_Pin_7 ;    //输出低电平}else{TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF_PP ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);  //翻转输出}
}

PWM输入(频率占空比检测)

PWM输入也是比赛的重点和难点,我希望你们对捕获比较寄存器有较为深刻的理解,我的这个仅供参考

void PWM_Capture_Config(void)
{TIM_ICInitTypeDef  TIM_ICInitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  /* Time base configuration */TIM_TimeBaseStructure.TIM_Period = 65535;   TIM_TimeBaseStructure.TIM_Prescaler = 72;   //1us +1TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;TIM_ICInitStructure.TIM_ICFilter = 0x0;      TIM_ICInit(TIM2, &TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;TIM_ICInitStructure.TIM_ICFilter = 0x0;TIM_ICInit(TIM2, &TIM_ICInitStructure);/* TIM enable counter */TIM_Cmd(TIM2, ENABLE);/* Enable the CC2 Interrupt Request */TIM_ITConfig(TIM2, TIM_IT_CC2|TIM_IT_CC3, ENABLE);
}u32 Freq_Ch2_Cap = 0;     //通道2的频率 (HZ)
u32 Freq_Ch3_Cap = 0;
u16 CH2_DATA_LAST = 0;    //存放上次捕获到的数据
u16 CH3_DATA_LAST = 0;void TIM2_IRQHandler(void)  //获取频率
{if(TIM_GetITStatus(TIM2, TIM_IT_CC2)!=RESET){Freq_Ch2_Cap = 1000000/((TIM2->CCR2) - CH2_DATA_LAST);CH2_DATA_LAST = (TIM2->CCR2);TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);   }if(TIM_GetITStatus(TIM2, TIM_IT_CC3)!=RESET){Freq_Ch3_Cap = 1000000/((TIM2->CCR3) - CH3_DATA_LAST);CH3_DATA_LAST = (TIM2->CCR3);TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);   }
}

蜂鸣器

注意PB4的问题,已经在GPIO的函数中配置

#define BEER_H (GPIOB->ODR |= GPIO_Pin_4)
#define BEER_L (GPIOB->ODR &= ~GPIO_Pin_4)

要求熟练掌握的知识

  • 由于第八届(我参加的这一届)是第一次出现了扩展板,我们当时是省赛不使用扩展板,国赛会用到,所以扩展版的代码我就不贴了,实在太长了,刚才还有RTC我都没有贴上来,我先说说扩展板需要熟练的东西,比赛的时候DS18B2和DHT11等是直接提供现成的驱动程序,我当时并不知道,所以我自己准备的是能够盲打扩展板上的所有外设的驱动程序,我希望读者不要因为直接提供驱动程序就不去过多关注这些外设,我个人建议你们能够做到盲打。
  • 熟练:
    能够至少输出两路占空比可调,频率固定的PWM
    能够至少输出两路频率可调,占空比固定的PWM
    能够至少输出两路频率可调,占空比可调的PWM
    能够至少检测两路PWM的频率和占空比
    能够查阅数据手册,轻松使用片上外设这IO口重映射

错失国一的自我反省

  • 这次我差一点获得国一,可能是因为比前面的人多错了一道客观题,失之毫厘差之千里,失败的原因有沉浸在自认无敌的良好状态(过于自负),决赛题目中有一个看似普通情况下是不可能完成的一道设问,我的经验直觉告诉我此时需要查阅数据手册,看看是否能够通过IO重映射来解决,答案是肯定的,我完美的解决了这个出题人的“圈套”,欣喜之下我忘乎了自己,骄傲自满认为别人都做的没自己好,于是开始懈怠。我在比赛结束还有一个小时前就完成了所有题目要求,起身提交题目转头就走,客观题检都没检查,导致了这个悲剧的发生,这种自负让我在8月的电子设计竞赛中又一次与国一失之交臂,被同伴称之为万年国二….. 不思悔改,方得(遭)始(报)终(应),望读者引以为戒。

客观题部分

  • STM32F103RBT6 基础知识 和 数电模电基础知识

64个引脚
Flash = 128 kb
Sram = 20 kb

STM32 F 103 C 8 T 6 A

F = 通用类型

103 = 增强型
101 = 基本型
102 = USB基本型,USB 2.0全速设备
105或107 = 互联型

T = 36脚
C = 48脚
R = 64脚
V = 100脚
Z = 144脚

4 = 16K 闪存存储器
6 = 32K
8 = 64K
B = 128K
C = 256K
D = 384K
E = 512K

H = BGA
T = LQFP
U = VFQFPN
Y = WLCSP64

6 = -40°C ~ 85°C
7 = -40°C ~ 105°C

A或者 空(内部代码,详见产品数据手册)

//——————————————————————–
7个TIMER = (有TIM1和TIM8)TIM1~TIM5
STM32RBT6只有4个定时器: TIM1~TIM4
2个SPI
2个I2C
2个12bit ADC
3个USART
1个USB
1个CAN
49个普通GPIO

第一部分:客观题
1.STM32F103RBT6单片机具有20___KByte RAM空间,____128__Kbyte Flash空间,______3个USART,_2___12位ADC。

2.以下哪种方法或工具可以对STM32进行程序下载( ABCD )
A. J-link
B. Co-Link
C.USART ISP
D.USART IAP

3.下面哪些描述是STM32 GPIO具备的特点( ABCD )
A. 单独的位设置、清除
B. 外部中断线/唤醒线
C. 复用功能和重映射
D.GPIO锁定机制

4.模拟信号采集设备,ADC参考电压为5V,要求分辨率达到5mV,ADC至少应选择( B )
A. 8位
B. 10位
C. 12位
D. 16位

5.STM32 DMA控制器可编程的数据传输数目最大为( D )
A.65536
B. 4096
C.1024
D. 65535

6.某系统需要永久存放少量(少于1K byte)参数,且需要频繁访问,最合适的存储器是( B )
A. SRAM
B. E2PROM
C. Nor Flash
D. Nand Flash

7.运算放大器的电源接入±12V,稳压管的稳定电压为6V,正向导通电压为0.6V,当输入电压Ui = -2V时,输出电压UO应该为( C )
A. -6V
B. -2V
C. +6V
D. 0.6V

8.以下哪几种操作系统适合在STM32系列微控制器( AB )
A. μCos-II
B. Free RTOS
C. Windows CE
D. Linux

//——————————-以下为我自己手动添加的试题———————————//
1.STM32内部提供了电压调节器,复位后电压调节器总是使能的。根据应用方式它以如下3 种不同的模式工作( D )。(多选)
A.运转模式
B.停止模式
C.待机模式
D.低功耗模式

2.不是STM32的低功耗模式有( D )。(多选)
A.睡眠模式
B.停止模式
C.待机模式
D.运转模式

3.在停止模式下,如下哪些是正确的( ABC )。(多选)
A.1.8V供电区域的所有时钟都被停止
B.PLL、HIS 和HSE RC振荡器的功能将被禁止
C.SRAM和寄存器内容将被保留下来
D.SRAM和寄存器内容将被丢失

1.DMA控制器可编程的数据传输数目最大为( B )。
A.65536
B.65535
C.1024
D.4096

2.每个DMA通道具有( A )个事件标志。
A.3
B.4
C.5
D.6

3.DMA控制器中,独立的源和目标数据区的传输宽度为( ABCD )(多选)。
A.字节
B.半字
C.全字
D.以上都可以

4.STM32中,1 个DMA请求占用至少( B )个周期的CPU 访问系统总线时间。
A.1
B.2
C.3
D.4

1.在STM32中,备份寄存器是( A )的寄存器。
A.16 位
B.32 位
C.8 位
D.4 位

2.为了允许访问备份寄存器和RTC,电源控制寄存器(PWR_CR)的DBP 位必须置为( A )。
A.1
B.2
C.0
D.3

3.下列哪个不是备份寄存器( C )。
A.BKP_DR1
B.BKP_DR3
C.BKP_RTCCR
D.BKP_DR5

1.若看门狗WWDG被启动,当递减计数器的值小于( A ),则产生复位。
A.0x40
B.0x70
C.0x4F
D.0x7F
2.在寄存器IWDG_KR中写入( A ),开始启用独立看门狗。
A.0xCCCC
B.0xBBBB
C.0xAAAA
D.0xDDDD

3.如果窗口看门狗启动,并且当7 位(T[6:0])递减计数器 ( A )时,则产生一个复位动作。
A.从0x40翻转到0x3F
B.从0x50翻转到0x4F
C.从0x60翻转到0x5F
D.从0x70翻转到0x6F

1.STM32的可编程TIM1定时器的时基单元包含( ABCD )。(多选)
A.计数器寄存器(TIM1_CNT)
B.预分频器寄存器 (TIM1_PSC)
C.自动装载寄存器 (TIM1_ARR)
D.周期计数寄存器 (TIM1_RCR)

2.高级定时器TIM1的特性( ABCD )。(多选)
A.具备16位上,下,上/下自动装载计数器
B.具备16位可编程预分频器。
C.可以在指定数目的计数器周期之后更新定时器寄存器。
D.可以通过事件产生中断,中断类型丰富,具备DMA功能。

3.定时器TIM1的特殊工作模式包括( ABCD )。(多选)
A.输入捕获模式
B.PWM 输入模式
C.编码器接口模式
D.单脉冲模式(OPM)

1.通用定时器TIMx的特性( ABCD )。(多选)
A.具备16位向上,向下,向上/向下自动装载计数器。
B.具备16位可编程预分频器。
C.具备4个独立通道。
D.可以通过事件产生中断,中断类型丰富,具备DMA功能。

2.通用定时器TIMx的特殊工作模式包括( ABCD )。(多选)
A.输入捕获模式
B.PWM 输入模式
C.输出模式
D.单脉冲模式(OPM)

3.STM32的可编程通用定时器的时基单元包含( ABC )。(多选)
A.计数器寄存器(TIMx_CNT)
B.预分频器寄存器(TIMx_PSC)
C.自动装载寄存器(TIMx_ARR)
D.以上都不是

1.ARM Cortex-M3不可以通过( D )唤醒CPU。
A.I/O端口
B.RTC 闹钟
C.USB唤醒事件
D.PLL

2.STM32嵌套向量中断控制器(NVIC) 具有( A ) 个可编程的优先等级。
A.16
B.43
C.72
D.36

3.STM32的外部中断/事件控制器(EXTI)支持( C )个中断/事件请求。
A.16
B.43
C.19
D.36

1.哪些是STM32的ADC系统的特点(多选)( ABCD )。
A.12-位分辨率
B.自校准
C.可编程数据对齐
D.单次和连续转换模式

2.在ADC的扫描模式中,如果设置了DMA位,在每次EOC后,DMA控制器把规则组通道的转换数据传输到( A )中。
A.SRAM
B.Flash
C.ADC_JDRx寄存器
D.ADC_CR1

3.STM32规则组由多达( A )个转换组成。
A.16
B.18
C.4
D.20

4.在STM32中,( A )寄存器的ALIGN位选择转换后数据储存的对齐方式。
A.ADC_CR2
B.ADC_JDRx
C.ADC_CR1
D.ADC_JSQR

1.STM32的Flash闪存编程一次可以写入( A )位。
A.16
B.8
C.32
D.4

2.STM32主存储块的页大小为( A ) 字节。
A.1K
B.3K
C.2K
D.4K

3.用户选择字节的大小为( A )。
A.512字节
B.2K
C.1K
D.128K

4.下列哪些不是STM32闪存存储器的特点( C )。
A.大容量
B.高速
C.掉电不保存
D.具有选择字节加载器

1.在APB2上的I/O脚的翻转速度为( A )。
A.18MHz
B.50MHz
C.36MHz
D.72MHz

2.定时器2的TIM2_REMAP[1:0]为“10”和“11”的重映射,适用于( AB )封装的芯片。
A.64引脚
B.100引脚
C.36引脚
D.144引脚

3.USART2的USART2_REMAP = 1的重映射只适用于( B )引脚的封装。
A.64引脚
B.100引脚
C.36引脚
D.144引脚

4.当输出模式位MODE[1:0]=“10”时,最大输出速度为( B )。
A.10MHz
B.2MHz
C.50MHz
D.72MHz

1.下列哪个不是RealView MDK开发环境的特点( D )。
A.Windows风格
B.兼容的Keil μVision界面
C.全面的ARM处理器支持
D.体积庞大

4.下列哪种方法可以对STM32进行程序下载( ABCD )。(多选)
A.Keil ULink
B.J-Link
C.在应用编程
D.以上都可以

1.在APB2上的I/O脚的翻转速度为( A )。
A.18MHz
B.50MHz
C.36MHz
D.72MHz

4.当输出模式位MODE[1:0]=“10”时,最大输出速度为( B )。
A.10MHz
B.2MHz
C.50MHz
D.72MHz

1.STM32的Flash闪存编程一次可以写入( A )位。
A.16
B.8
C.32
D.4

2.STM32主存储块的页大小为( A ) 字节。
A.1K
B.3K
C.2K
D.4K

3.用户选择字节的大小为( A )。
A.512字节
B.2K
C.1K
D.128K

4.下列哪些不是STM32闪存存储器的特点( C )。
A.大容量
B.高速
C.掉电不保存
D.具有选择字节加载器

1.哪些是STM32的ADC系统的特点(多选)( ABCD )。
A.12-位分辨率
B.自校准
C.可编程数据对齐
D.单次和连续转换模式

2.在ADC的扫描模式中,如果设置了DMA位,在每次EOC后,DMA控制器把规则组通道的转换数据传输到( A )中。
A.SRAM
B.Flash
C.ADC_JDRx寄存器
D.ADC_CR1

3.STM32规则组由多达( A )个转换组成。
A.16
B.18
C.4
D.20

4.在STM32中,( A )寄存器的ALIGN位选择转换后数据储存的对齐方式。
A.ADC_CR2
B.ADC_JDRx
C.ADC_CR1
D.ADC_JSQR

1.ARM Cortex-M3不可以通过( D )唤醒CPU。
A.I/O端口
B.RTC 闹钟
C.USB唤醒事件
D.PLL

2.STM32嵌套向量中断控制器(NVIC) 具有( A ) 个可编程的优先等级。
A.16
B.43
C.72
D.36

3.STM32的外部中断/事件控制器(EXTI)支持( C )个中断/事件请求。
A.16
B.43
C.19
D.36

1.STM32的USART根据( A )寄存器M位的状态,来选择发送8位或者9位的数据字。
A.USART_CR1
B.USART_CR2
C.USART_BRR
D.USART_CR3

2.STM32的bxCAN的主要工作模式为( ABD )。
A.初始化模式
B.正常模式
C.环回模式
D.睡眠模式

3.在程序中,可以将CAN_BTR寄存器的( AB )位同时置1,来进入环回静默模式。(多选)
A.LBKM
B.SILM
C.BTR
D.以上都不是

1.通用定时器TIMx的特性( ABCD )。(多选)
A.具备16位向上,向下,向上/向下自动装载计数器。
B.具备16位可编程预分频器。
C.具备4个独立通道。
D.可以通过事件产生中断,中断类型丰富,具备DMA功能。

2.通用定时器TIMx的特殊工作模式包括( ABCD )。(多选)
A.输入捕获模式
B.PWM 输入模式
C.输出模式
D.单脉冲模式(OPM)

3.STM32的可编程通用定时器的时基单元包含( ABC )。(多选)
A.计数器寄存器(TIMx_CNT)
B.预分频器寄存器(TIMx_PSC)
C.自动装载寄存器(TIMx_ARR)
D.以上都不是

1.STM32的可编程TIM1定时器的时基单元包含( ABCD )。(多选)
A.计数器寄存器(TIM1_CNT)
B.预分频器寄存器 (TIM1_PSC)
C.自动装载寄存器 (TIM1_ARR)
D.周期计数寄存器 (TIM1_RCR)

2.高级定时器TIM1的特性( ABCD )。(多选)
A.具备16位上,下,上/下自动装载计数器
B.具备16位可编程预分频器。
C.可以在指定数目的计数器周期之后更新定时器寄存器。
D.可以通过事件产生中断,中断类型丰富,具备DMA功能。

3.定时器TIM1的特殊工作模式包括( ABCD )。(多选)
A.输入捕获模式
B.PWM 输入模式
C.编码器接口模式
D.单脉冲模式(OPM)

1.STM32提供了三种不同的时钟源,其都可被用来驱动系统时钟SYSCLK,这三种时钟源分别为( ABC )。
A.HSI振荡器时钟
B.HSE振荡器时钟
C.PLL时钟
D.HLI振荡时钟

2.在STM32中,当( AB )发生时,将产生电源复位。(多选)
A.从待机模式中返回
B.上电/掉电复位(POR/PDR复位)
C.NRST管脚上的低电平
D.PLL

3.以下哪个时钟信号可被选作MCO 时钟( ABCD )。(多选)
A.SYSCLK
B.HSI
C.HSE
D.以2分频的PLL 时钟

1.在STM32中,备份寄存器是( A )的寄存器。
A.16 位
B.32 位
C.8 位
D.4 位

2.为了允许访问备份寄存器和RTC,电源控制寄存器(PWR_CR)的DBP 位必须置为( A )。
A.1
B.2
C.0
D.3

3.下列哪个不是备份寄存器( C )。
A.BKP_DR1
B.BKP_DR3
C.BKP_RTCCR
D.BKP_DR5

1.DMA控制器可编程的数据传输数目最大为( A )。
A.65536
B.65535
C.1024
D.4096

2.每个DMA通道具有( A )个事件标志。
A.3
B.4
C.5
D.6

3.DMA控制器中,独立的源和目标数据区的传输宽度为( ABCD )(多选)。
A.字节
B.半字
C.全字
D.以上都可以

4.STM32中,1 个DMA请求占用至少( B )个周期的CPU 访问系统总线时间。
A.1
B.2
C.3
D.4

祝愿各位不留遗憾,加油

蓝桥杯嵌入式类比赛经验分享相关推荐

  1. 【数学建模类比赛经验分享】——国赛

    ! 前前言 博主目前本科,因此所分享的经验也是关于本科类竞赛.如果某些比赛描述带有歧义,一律按针对本科生的竞赛处理. 0 前言 博主本人参加2019年数学建模国赛,获国家级一等奖,并于2020年参加美 ...

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

    [蓝桥杯嵌入式]比赛笔记(2)根据固件库快速配置各模块初始化 因为蓝桥杯比赛时间很短,并且如果自己去记忆各模块初始化的话,也难免有问题,所以这里给出一个通过固件库的快速初始化模块的方法. 比赛提供固件 ...

  3. 国信长天蓝桥杯嵌入式类——stm32——使用keil4建立工程文件过程

    蓝桥杯嵌入式----使用keil4建立工程文件过程 目录 蓝桥杯嵌入式----使用keil4建立工程文件过程 一.完成文件建立 (一).先建立名为test工程文件夹,如图.并建立如下几个文件夹 (二) ...

  4. 干货!蓝桥杯单片机组一经验分享

    原创李志锐 路飞的电子设计宝藏 4月21日 现在大学生越来越内卷了,搞几个国一防身是极好的,或者只为通过准备比赛提高自己的电子编程能力,也算是没有荒废度日. 我连续获得了三届的蓝桥杯电子类单片机组的国 ...

  5. 蓝桥杯竞赛指南及经验分享

    CSDN话题挑战赛第1期 活动详情地址:https://marketing.csdn.net/p/bb5081d88a77db8d6ef45bb7b6ef3d7f 参赛话题:大学生竞赛指南 话题描述: ...

  6. 蓝桥杯单片机国二经验分享

    文章目录 前言 一.比赛经历 二.学习方法 1.程序题 2.客观题 总结 前言 这次在第十三届蓝桥杯中获得了国二,差一点国一还是很可惜的,PWM太久没有写忘记了很可惜,下面给大家分享一些自己的经验和方 ...

  7. 蓝桥杯软件类比赛java,第十届蓝桥杯大赛软件类省赛

    第十届蓝桥杯大赛软件类省赛 这些题官网还没有解答的,我主要参考了b站UP主大雪菜的解法(绝大部分题先自己做了一遍),当然也网上查了一些解答,但发现现在网上的一些解法并不正确,希望可以给大家一个参考. ...

  8. 【蓝桥杯嵌入式】比赛笔记(1)基础模块配置

    基础模块配置 GPIO 步骤 代码 SysTick 步骤 代码 USART 步骤 代码 LCD 步骤 KEY 步骤 代码 KEY_EXTI 步骤 代码 ADC 步骤 代码 EEPROM Buzz 步骤 ...

  9. 第九届蓝桥杯-嵌入式比赛体会与备赛经验

    原文地址:http://www.cnblogs.com/NickQ/p/8721317.html 说起蓝桥杯,相信很多电子类的学生,应该很熟悉了吧...上周日,我也去湖北工业大学参与了一下.说起这次经 ...

最新文章

  1. java filehelper_Spring 发送邮件 使用File指定附件
  2. 360浏览器打不开网页_苹果移动端、PC端safari浏览器打不开网页的解决方案!
  3. linux c代码出现段错误,Linux下段错误(C语言)
  4. cisco配置交换机管理地址和默认网关
  5. 程序员——知识 [转载]
  6. seay代码审计工具_渗透测试-代码审计入门之BlueCMS v1.6 sp1
  7. 计算机驱动程序检测,检测到计算机制造商图形驱动程序对于显卡驱动程序
  8. SPSS Modeler 聚类分析(第十六章)
  9. java 加权平均_加权平均值 - 不羁之后的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. android 实现重力感应,Android重力感应实现方式是怎样实现的?
  11. 80后,我们难忘的电视剧
  12. Python手把手实现远程控制桌面
  13. A16z、YGG、Axie 圆桌对话:Web3 游戏接下来该怎么走?
  14. 今天大年三十,新年快乐,我在这里给大家整理了一下除夕的习俗,来看看吧
  15. 华为桌面云虚拟机卸载VM Tools工具计算机蓝屏开机不了-完美解决
  16. 为什么要对数据进行归一化处理
  17. win10 创建访客_建立一个访客会很喜欢的网站
  18. 【网络工程】9、实操-万达酒店综合项目(三)
  19. ValidationError: Progress Plugin Invalid Options报错options should NOT have additional properties
  20. imagettftext php,imagettftext

热门文章

  1. dpbs和pbs的区别_PBS缓冲液和Hanks缓冲液的区别
  2. GitHub 上标星 9.4K 的云盘系统
  3. Mybatis Plus SQL语句中 字段为数据库关键字的解决方案
  4. MIDI制作的相关软件
  5. 底部选项卡凸出底部栏的解决办法
  6. Centos7 配置 Vmess
  7. kubernetes--最小特权原则(POLP)
  8. c语言怎么快速乘法口诀表,乘法口诀表,C语言实现
  9. 微信 根据当前地理位置经纬度计算1000米以内的经纬度范围 php版
  10. 字符char、字节byte傻傻分不清(2015年10月13日)