蓝桥杯嵌入式参赛笔记(基于stm32竞赛板)

这篇博客是作者参加蓝桥杯嵌入式竞赛时的学习笔记,主要包括STM32F103RB芯片的LED控制、USART串口通信、SysTick延时、EXTI按键中断、LCD显示、ADC转换和TIMER的时基计数、PWM输出及输入捕获功能的实践应用。作者通过详细的代码示例和注意事项,分享了STM32开发的经验和技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

  虽然这个充满信心的比赛最后由于一些***的原因自己几乎没有做交的白卷,但通过再一次的学习stm32,自己还是有不少的收获。

  现把自己当时的笔记复制到这,作为一个记录以及交流,同时也作为第一篇博客微笑

 

 

 

一、     新建工程

略有不同的是程序的下载方法,需要装驱动。。。

 

 

 

二、  LED

电路原理图:

比赛板用的是stm32f103rb芯片,64管脚,LED与LCD同用了管脚PC8~PC15(对应LED1~LED8),所以增用了一个锁存器——M74HC573。在控制LED的时候,只需在输出对应电平后,给锁存器的LE(N—LE,对应PD2)管脚一个上升沿脉冲即可把对应的电平锁存到锁存器的输出端(Q1~Q8),从而控制LED。

 

需要注意的是:1、LCD的操作会影响LED的亮灭,如LCD的行写会点亮所有的LED,需进行程序处理;

2、对锁存器LE管脚的操作,给一个上升沿脉冲后应把对应的控制引脚(PD2)置低电平,以免LCD的操作影响LED的亮灭混乱。

 

有关蜂鸣器的使用比较简单,在这里一起说明:比赛板的蜂鸣器连在PB4上,

需注意的是Pb4管脚是JTAG调试接口之一,需要在程序中失能JTAG才可以使用Pb4管脚,如下语句:    /* Disable the Serial WireJtag Debug Port SWJ-DP */

GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);

然而程序中用了这一句后,下次用JTAG下载程序时就下载不进去了,解决办法是:先按着开发板的RESET 按键别松手,再点击keil中的下载,然后松手按键,程序就可正常下载进去了。

 

 

三、           USART

CT1117开发板的USART2与下载程序的USB方口集成在一起,使用时只需装好对应的驱动即可实现电脑与开发板的串口通信(部分串口调试工具可能搜不到串口)。

 

比赛时对串口的使用方式可能性比较大的是,通过电脑发送指令控制stm32以执行相应操作,所以我结合LED编写了一个练习程序,使用串口发送指令控制LED亮灭,同时在LCD上显示最近一次所接收到的命令。串口的接收命令使用的是中断的方式,代码如下:

 

//配置串口2

void USART_Configuration(void)

{

         GPIO_InitTypeDefGPIO_InitStructure;

         USART_InitTypeDefUSART_InitStructure;

         NVIC_InitTypeDefNVIC_InitStructure;

        

         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

 

         GPIO_InitStructure.GPIO_Pin= GPIO_Pin_2;//PA2   Tx

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

 GPIO_Init(GPIOA, &GPIO_InitStructure);

        

         GPIO_InitStructure.GPIO_Pin= GPIO_Pin_3;//PA3   Rx

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

 GPIO_Init(GPIOA, &GPIO_InitStructure);

        

         USART_InitStructure.USART_BaudRate= 9600;

 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);//使能USART2

        

         /*Configure the NVIC Preemption Priority Bits */ 

 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

 

  /*Enable the USARTy Interrupt */

 NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;

 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

 NVIC_Init(&NVIC_InitStructure);

        

         USART_ITConfig(USART2,USART_IT_RXNE, ENABLE);//使能接受中断

}

 

//中断服务函数

void USART2_IRQHandler(void)

{

 if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)

  {

    /*Read one byte from the receive data register */

   RxBuffer[RxCounter] = USART_ReceiveData(USART2);

                  

                   if(RxBuffer[RxCounter]=='x')//指令格式led2_onx,以’x’作为命令的结尾

                   {

                            rxflag=1;  //接受到命令的标志

                            RxCounter=0;

                   }

                   elseRxCounter++;

                   if(RxBuffer[0]!='l')//此句避免接受命令混乱

RxCounter=0; 

  }

         USART_ClearITPendingBit(USART2,USART_IT_RXNE);//

 

}

 

//对于通过串口向电脑发送数据,采用printf()函数的重定向

int fputc(int ch,FILE *f)

{

         USART_SendData(USART2,(uint8_t)ch);

          while (USART_Get

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值