
void usart_Config(void) { /*----------------串口配置----------------*/ GPIO_InitTypeDef GPIO_Struct; USART_InitTypeDef USART_Struct; NVIC_InitTypeDef USART_NVIC_Struct; //打开gpio时钟和串口时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //配置复用功能 GPIO_PinAFConfig(GPIOB,GPIO_PinSource10, GPIO_AF_USART3); GPIO_PinAFConfig(GPIOB,GPIO_PinSource11 , GPIO_AF_USART3); //gpio初始化 GPIO_Struct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; GPIO_Struct.GPIO_Mode = GPIO_Mode_AF; GPIO_Struct.GPIO_OType = GPIO_OType_PP; GPIO_Struct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Struct.GPIO_Speed = GPIO_Speed_50MHz; //把结构体初始化参数传给寄存器 GPIO_Init(GPIOB, &GPIO_Struct); /*----------------串口配置-------------------*/ USART_Struct.USART_BaudRate = 115200; USART_Struct.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_Struct.USART_Mode = USART_Mode_Tx; USART_Struct.USART_Parity = USART_Parity_No; USART_Struct.USART_StopBits = USART_StopBits_1; USART_Struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None ; USART_Init(USART3, &USART_Struct); USART_Cmd(USART3, ENABLE); //使能串口接收中断 USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); //开启相关中断 USART_NVIC_Struct.NVIC_IRQChannel = USART3_IRQn ; USART_NVIC_Struct.NVIC_IRQChannelPreemptionPriority =3; USART_NVIC_Struct.NVIC_IRQChannelSubPriority = 3; USART_NVIC_Struct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&USART_NVIC_Struct); } void USART_SendByte(USART_TypeDef* USARTx, uint8_t Data) { USART_SendData(USARTx, Data); while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); } //main函数 int main(void) { NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 ); usart_Config(); USART_SendByte(USART3, 0xFF); while(1); } 使用的市stm32f407系列的,使用串口3.USB转串口使用的市CP2102芯片。发送的数据和接收的数据不同。一直没找到原因。请求大神帮助。 |
波特率一致,几个波特率都试了,显示方式位16进制。这些都检查确认多次,没有问题。
相关的 USART3_IRQHandler没有吧??
还应加上发送中断开启【上句后】 USART_ITConfig(USART3, USART_IT_TC, ENABLE);
我上面市写了接收中断,但是我没有用,因为我只是发送,发送不用中断的啊。所以目前也不用写中断程序。
交叉连的。还接了一个0v。
1.首先我用的模板程序使用的外部晶振为25M的。但是我自己实验用的板子使8M的,发现这是导致问题发生的根本。
2,如何修改使内部参数符合外部晶振
修改的地方一:搜索HSE_VALUE宏定义,在stm32f4xx.h里面的HSE_VALUE,系统默认采用外部8M或者25M晶振,把它改成所使用板子的外部晶振对应的值。所以 #define HSE_VALUE ((uint32_t)8000000) ,或者#define HSE_VALUE ((uint32_t)25000000) 。我这个例子中把25M改成8M.
修改的地方二:搜索PLL_M宏定义,修改宏定义的值,因为M407锁相环的分频因子为PLL_M=8,PLL_N336,PLL_P=2.而模板中的分频因子分别为25,360,2.所以,我的这个例子,是把PLL_M=25改成8,改完ok。
好 好 好