虽然这个充满信心的比赛最后由于一些***的原因自己几乎没有做交的白卷,但通过再一次的学习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