带STM32F373VCt6的USART

带STM32F373VCt6的USART,stm32,Stm32,我是新来的。我刚刚开始用STM32F373VCT6学习STM32F373。我使用CMSIS来配置UART1。看来我的代码没有任何错误。但当我使用PL2303转换串行usb与PC连接时,我没有收到任何信息 这是我的密码。谁能帮我找出你的错误吗 /*包括------------------------------------------------------------------*/ #包括“stm32f37x.h” #包括“main.h” uint8_t ledVal=0; 静态IO uint

我是新来的。我刚刚开始用STM32F373VCT6学习STM32F373。我使用CMSIS来配置UART1。看来我的代码没有任何错误。但当我使用PL2303转换串行usb与PC连接时,我没有收到任何信息

这是我的密码。谁能帮我找出你的错误吗

/*包括------------------------------------------------------------------*/
#包括“stm32f37x.h”
#包括“main.h”
uint8_t ledVal=0;
静态IO uint32时间延迟;
/*私有类型定义-----------------------------------------------------------*/
/*私有定义------------------------------------------------------------*/
#定义BSRR_VAL 0x0003
/*私有宏-------------------------------------------------------------*/
/*私有变量---------------------------------------------------------*/
GPIO_InitTypeDef GPIO_InitStructure;
/*私有函数原型-----------------------------------------------*/
uint8\u t SendChar(uint8\u t ch);
无效GPIO_配置(无效);
无效USART1_配置(无效);
uint8_t GetChar(无效);
内部主(空)
{
/*!<在此阶段,微控制器时钟设置已配置,
这是通过SystemInit()函数完成的,该函数在启动时调用
文件(startup_stm32f37x.s)在分支到主应用程序之前。
要重新配置SystemInit()函数的默认设置,请参阅
system_stm32f37x.c文件
*/
//SystemInit();
/*GPIOC外围时钟启用*/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,启用);
/*在输出推拉模式下配置PC0和PC1*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType\u PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC和GPIO_InitStructure);
GPIO_Config();
USART1_Config();
if(系统时钟配置(系统时钟/1000))
而(1),;
而(1)
{
/*设置PC0和PC1*/
GPIO_写入比特(GPIOC,GPIO_引脚_13,(ledVal)?位_设置:位_重置);
ledVal=1-ledVal;
SendChar('f');
延迟(250);
}
}
#ifdef使用_FULL_断言
/**
*@brief报告源文件的名称和源行号
*发生断言参数错误的位置。
*@param file:指向源文件名的指针
*@param-line:assert_-param错误行源编号
*@retval无
*/
无效断言失败(uint8\u t*文件,uint32\u t行)
{ 
/*用户可以添加自己的实现来报告文件名和行号,
例如:printf(“错误的参数值:第%d行的文件%s\r\n”,文件,第行)*/
/*无限循环*/
而(1)
{
}
}
#恩迪夫
/**
* @}
*/
/**
* @}
*/
/************************(C)STMicroelectronics版权所有******文件结束****/
无效GPIO_配置(无效){
//PC4配置(TX)
RCC->AHBENR |=1 MODER |=2 OTYPER |=1 ospeder |=3 PUPDR&=~(3 AFR[0]|=7 MODER |=2 AFR[0]|=7 APB2ENR |=RCC|APB2ENR|u USART1EN | RCC| APB2ENR| u SYSCFGEN//启用USART1时钟
USART1->BRR=72000000/115200;
USART1->CR1&=~USART\U CR1\U OVER8;//过采样模式=16
USART1->CR1&=~USART\U CR1\U M;//字长=8位
USART1->CR2&=~(USART_CR2_STOP_1 | USART_CR2_STOP_0);//一个停止位
USART1->CR1&=~USART\U CR1\U PCE;//无奇偶校验
USART1->CR1 |=USART_CR1_UE;//USART启用
USART1->CR1 |=USART_CR1_RE;//接收器启用
USART1->CR1 |=USART_CR1_TE;//变送器启用
}
uint8\u t SendChar(uint8\u t ch)
{
而(!(USART1->ISR和USART_ISR_TXE));
USART1->TDR=(ch&0xFF);
返回(ch);
}
uint8\u t GetChar(无效)
{ 
而(!(USART1->ISR和USART_ISR_RXNE));
返回((uint8_t)(USART1->RDR&0xFF));
}
/*延迟功能*/
无效延迟(IO uint32时间)
{
计时延迟=nTime;
while(计时延迟!=0);
}
/*减量*/
无效定时延迟减量(无效)
{
如果(计时延迟!=0x00)
定时延迟--;
}
RCC
操作后的延迟丢失
STM32F373
系列的勘误表显示

2.1.2 RCC外围时钟启用后的延迟

描述 RCC外围时钟启用和有效外围启用之间的延迟 为了管理外设读/写自/到寄存器,应考虑。 此延迟取决于外围映射

如果外围设备映射到AHB上:在时钟启用位启用后,延迟为2个AHB时钟周期 在硬件寄存器上设置

如果外设映射到APB:在硬件寄存器上设置时钟启用位后,延迟为2个APB时钟周期

变通办法

  • 有时在需要外围读/写寄存器之前启用外围时钟

  • 对于AHB外围设备,向外围设备寄存器插入两个虚拟读取

  • 对于APB外围设备,在外围设备寄存器中插入一个虚拟读数

  • 如果没有此延迟,紧跟在RCC启用操作之后的读取(或两次)可能返回0,而不管寄存器值如何,或者前两次写入可能被外围设备忽略

    库函数RCC_ahbperipclockCmd()
    可能已经包含此延迟,但请检查Stdperiph源以确保

    如果可能的话,我通常在一开始就对RCC访问进行分组,首先从我要使用的外围设备开始

    RCC->AHBENR |= 1 << 19; // enable GPIOC clock              // (1)
    RCC->APB2ENR |= RCC_APB2ENR_USART1EN|RCC_APB2ENR_SYSCFGEN; // (2)
    GPIOC->MODER = whatever;                                   // (3)
    // ...
    USART1->BRR = divisor;
    
    RCC->AHBENR |=1 APB2ENR |=RCC_APB2ENR_USART1EN | RCC_APB2ENR_SYSCFGEN;//(2)
    GPIOC->MODER=无论什么;//(3)
    // ...
    USART1->BRR=除数;
    
    这样,(2)中的读-修改-写操作将在启用
    GPIOC
    (1)和使用它(3)之间引入足够的延迟