在学习407串口通信,按照原子哥的串口教程一步一步学习(串口助手发送一个数据,单片机接受到后,再发送回电脑),程序编写没有错误。板子用的是407最小系统办,串口用的是CH340G转TTL 模块,用STLINK下载的。串口助手配置和程序一样,但是下载后实现不了.
USART.C程序
#include "stm32f4xx.h"
#include "USART.H"
#include "LED.H"
void my_uart_init(u16 bound)
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//外设时钟使能函数。这两个函数在RCC.H头文件中定义了
RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1,ENABLE );//使能USART1时钟
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA,ENABLE );//使能GPIOA时钟
//复用映射设置。USART1所使用的PA9、PA10进行复用映射
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//USART引脚PA9复用映射
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//USART引脚PA10复用映射
//GPIOA9,10初始化
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;//初始化PA9、PA10
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;//复用模式
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_100MHz;//速度100MHz
GPIO_Init(GPIOA,&GPIO_InitStruct);//GPIOA初始化
//USART初始化
USART_InitStruct.USART_BaudRate=bound;//设置波特率
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;//数据宽度为8个字节,如果有奇偶校验要设置为9个字节
//USART_InitStruct.USART_WordLength=USART_WordLength_9b;//数据宽度为9个字节,有奇偶校验时要用此函数
USART_Init(USART1,&USART_InitStruct);
//中断使能
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//串口中断使能,串口1、接收非空、使能
//中断初始化
//使能中断时,1、需要在主函数中调用中断分组函数"NVIC_PriorityGroupConfig()"
// 2、编写中断服务函数,调用函数"USARTx_IRQHandler()"
NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;//在顶层头文件“stm32f4xx”中找相应的通道
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct); //初始化中断
//USART串口使能
USART_Cmd(USART1,ENABLE);
}
//中断服务函数,在启动文件中
void USARTx_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
u8 RES; //定义串口数据变量
RES=USART_ReceiveData(USART1);//从串口接收数据
USART_SendData(USART1,RES); //把从串口接收到的数据发送出去
}
}
USART.H程序
#ifndef __USART_H
#define __USART_H
#include "stdio.h"
#include "stm32f4xx_conf.h"
#include "sys.h"
extern u16 bound;
extern void my_uart_init(u16 bound);
#endif
main.c程序
#include "stm32f4xx.h"
#include "USART.H"
#include "delay.h"
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组,此函数在“misc.h"中
my_uart_init(115200);
}
KEIL该配置的都配置了,请各位大神帮帮忙,找一下问题,谢谢! |