完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
串口控制LED 大概通一下流程,具体USART和NVIT后续再写 不得抱怨一句,这芯片贵的让人发吐,让我们学生党还怎么活 最近学习越学越没有动力,一点学习的心情都没,脑壳疼,先把32入门看后续写会不会得手,再画一个ZET6… 要做的事情还有很多很多 (一)配置GPIO 使用串口一,串口一为PA9 PA10 //定义结构体 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟 //USART1_TX GPIOA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 (在全双工模式下) GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9 //USART1_RX GPIOA.10初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 (在全双工模式下) GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10 配置PA9为复用推挽模式,PA10为浮空输入 (二)配置USART 先贴.h文件,事实证明多练习宏定义,可增加代码移植效率 #define DEBUG_USARTx USART1 //串口1 #define DEBUG_USART_CLK RCC_APB2Periph_USART1 //使能USART1 #define DEBUG_USART_BAUDRATE 115200 //配置波特率 #define DEBUG_USART_IRQ USART1_IRQn//USART1为中断源 #define DEBUG_USART_IRQHandler USART1_IRQHandler//中断服务函数宏定义 void Uart_Init(void); void Usart_SendByte(USART_TypeDef* pUSARTx,uint8_t dat); void Usart_SendStr(USART_TypeDef* sUSARTx,uint8_t *str); //定义结构体 USART_InitTypeDef USART_InitStructure; //注意USART1在APB2上 其他在APB1上 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;//串口波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 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(DEBUG_USARTx, &USART_InitStructure); //初始化串口1 //如果不使用中断 或者在 main.c中 使用getchar等输入函数时为避免不能接收 可关闭使能DISABLE USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);//开启串口接受中断 USART_Cmd(DEBUG_USARTx, ENABLE);//打开串口1使能 USART结构体定义如图 啰嗦一句 //如果不使用中断 或者在 main.c中 使用getchar等输入函数时为避免不能接收 可关闭使能 get_c = getchar(); switch(get_c) { case '1': LED0 = 0;break; case '2': LED0 = 1;break; } (三)配置NVIC 初始化结构体 NVIC_InitTypeDef NVIC_InitStructure; //Usart1 NVIC 配置 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断控制器组选择 NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ; //USART1为中断源 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 NVIC结构体定义如下 (四)重定义fputc,fgetc函数 加#include 如果编译出错,勾选Micro LIB(缺省 C 库的备选库 咱不讨论) //重定义fputc函数 int fputc(int ch, FILE *f) { // while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 // USART1->DR = (u8) ch; USART_SendData(DEBUG_USARTx,(uint8_t ) ch); while(USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET); return ch; } int fgetc(FILE *f) { //等待串口输入数据 while(USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET); return (int)USART_ReceiveData(DEBUG_USARTx); } //int fgetc(FILE *f) //{ // while(!(DEBUG_USARTx->SR & (1 << 5)));//等待数据接收完成 // return DEBUG_USARTx->DR; //} 这是判断串口收发的标志位函数 (五)发送一字节数据和字符串数据 与51相似,但须注意USART_GetFlagStatus函数的配置 这是判断串口收发的标志位函数 void Usart_SendByte(USART_TypeDef* pUSARTx,uint8_t dat) { USART_SendData(pUSARTx,dat); while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); } void Usart_SendStr(USART_TypeDef* sUSARTx,uint8_t *str) { uint8_t i=0; while(1) { Usart_SendByte(sUSARTx,str[i++]); if(str==' |