stm32f103RCT6 串口4,串口5 不能正常使用

2019-10-14 23:20发布

原子大哥,借贵地 一用,我的串口4,串口5 初始化如下
void uart4_init(u32 pclk1,u32 bound) //PC10---tx,PC11--rx

{   
 float temp;
 u16 mantissa;
 u16 fraction;   
 temp=(float)(pclk1*1000000)/(bound*16);//
 mantissa=temp;     
 fraction=(temp-mantissa)*16; //??????????·? 
  mantissa<<=4;
 mantissa+=fraction;
 
 //RCC->APB2ENR|=1<<5;    //????PORTd?±??
 RCC->APB2ENR|=1<<4;    //????PORTc?±??  RCC->APB1ENR|=1<<19;  //????????4?±??    19??  UART4EN??UART4?±?????? (UART 4 clock enable)
 GPIOC->CRH&=0XFFFF00FF; //??????
  GPIOC->CRH|=0X00008B00; //PC11?????????ì????,PC10??????????
    
 RCC->APB1RSTR|=1<<19;   //????????5
 RCC->APB1RSTR&=~(1<<19);//????????
        
 //?¨?????è??
  UART4->BRR=mantissa; // ?¨?????è?? 
 UART4->CR1|=0X200C;  //1??????,?????é??.
 UART4->CR1|=1<<8;    //PE???????
 UART4->CR1|=1<<5;    //??????????·???????????    
 
 MY_NVIC_Init(3,3,UART4_IRQChannel,2);//????????????3 ?ì??????????3 ×é2??×????????? } void uart5_init(u32 pclk1,u32 bound) //PC12--tx,PD2---rx
//???? 2??3??4??5 ??pclk1 36m  ?÷??????uart_init5 (36,9600);    //9600?¨????pclk1 =36m
{   
 float temp;
 u16 mantissa;
 u16 fraction;   
 temp=(float)(pclk1*1000000)/(bound*16);//????USARTDIV
 mantissa=temp;     //??????????·?
 fraction=(temp-mantissa)*16; //??????????·? 
    mantissa<<=4;
 mantissa+=fraction;  RCC->APB2ENR|=1<<5;    //????PORTd?±??
 RCC->APB2ENR|=1<<4;    //????PORTc?±??  RCC->APB1ENR|=1<<20;  //????????5?±??    20??  UART5EN??UART5?±?????? (UART 5 clock enable)
 
 GPIOC->CRH&=0XFFF0FFFF; //??????//PC12--tx,PD2---rx
 GPIOD->CRL&=0XFFFFF0FF;
 
  GPIOC->CRH|=0X00080000; //PB11?????????ì????,PB10??????????
 GPIOD->CRL|=0x00000B00;  
 RCC->APB1RSTR|=1<<20;   //????????5
 RCC->APB1RSTR&=~(1<<20);//????????
        
 //?¨?????è??
  UART5->BRR=mantissa; // ?¨?????è?? 
 UART5->CR1|=0X200C;  //1??????,?????é??.
 UART5->CR1|=1<<8;    //PE????????
 UART5->CR1|=1<<5;    //??????????·???????????      
 MY_NVIC_Init(3,3,UART5_IRQChannel,1);//????????????3 ?ì??????????3 ×é2??×????????? }
打印函数如下:
void UART4_SendByte(unsigned char data)
{
  UART4->SR;
 UART4->DR=data;
 while((UART4->SR&0X40)==0);//????·????á?? } void UART4_SendStr(unsigned char const *str)
{
   while(1)
   {
  if( *str == '' ) break;
      UART4_SendByte(*str++);        //·???????
   } } void UART5_SendByte(unsigned char data)
{
  UART5->SR;
 UART5->DR=data;
 while((UART5->SR&0X40)==0);//????·????á?? } void UART5_SendStr(unsigned char const *str)
{
   while(1)
   {
  if( *str == '' ) break;
      UART4_SendByte(*str++);        //·???????
   } }
就是没出来 打印,串口1,2,3都有的。是不是 跟 那个映射有关的?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
正点原子
1楼-- · 2019-10-14 23:57
哪个映射?
正点原子
2楼-- · 2019-10-15 00:41
 精彩回答 2  元偷偷看……
guo19877
3楼-- · 2019-10-15 00:58
回复【3楼】正点原子:
---------------------------------
PC10,PC11 默认是 uart4的tx,rx。重定义就可以是变成 Uart3。。。。很奇怪,我没有重新定义,都是默认的。应该有串口4,5的 打印输出。
ST-FAE-SALE
4楼-- · 2019-10-15 02:31
你程序是否写法故障,导致的呢?
a6770126
5楼-- · 2019-10-15 04:58
回复【楼主位】guo19877:
---------------------------------
STM32最多可提供5路串口(ALIENTEK Mini STM32使用的是STM32F103RBT6,只有3个串口)
w0rmis20
6楼-- · 2019-10-15 10:16
回复【5楼】ST-FAE-SALE:
---------------------------------
你好,我用的芯片是STM32F103RCT6 芯片是64脚的,手册上说有5个串口。。。可是串口4,5怎么用的?找不到对应的引脚啊。谢谢!!

一周热门 更多>