OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3315|回复: 6

基于STM32F407的串口1改成串口3,无反应,求助?

[复制链接]

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2019-8-3
在线时间
20 小时
发表于 2019-12-31 22:20:09 | 显示全部楼层 |阅读模式
ST32F407的串口实验,串口1下载在板子上没有问题,把串口1改成串口3,下载在板上,只有一个LED灯在闪,ATK XCOM 的串口助手里没有接收信息。
关于串口我有很多问题,现在最主要的两个问题是:
1)如果PC没 COM2口,USART2就没能设置了吗?
2)上面那个USART3的串口代码改?求大侠们帮我看看。我把板子的接串口,还是跳线帽插了?
(先前在这个论坛里找到UASRT2的代码下载测过,没有成功,但是那代码被我改成UASRT1,是可以的。改成UASRT3就接收不了了。)

我改到串口的文件一共有三件:1)usart.h   里面的USART1改为USART3
                                            2)usart.c    里面的USART1改为USART3 之外,还改了APH2改为APH1,原来的PA9,PA10也改为PB10,PB11
                                            3)main.c    里面的USART1改为USART3
下面是贴的改到过的部分代码:

#ifndef __USART_H
#define __USART_H
#include "stdio.h"
#include "stm32f4xx_conf.h"
#include "sys.h"

   
[url=]

//********************************************************************************

//////////////////////////////////////////////////////////////////////////////////  
#define USART_REC_LEN     200   //
#define EN_USART3_RX    1  //
extern u8  USART_RX_BUF[USART_REC_LEN];
extern u16 USART_RX_STA;         

void uart_init(u32 bound);
#endif




#include "sys.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////   

#if SYSTEM_SUPPORT_OS
#include "includes.h"   
#endif
//////////////////////////////////////////////////////////////////////////////////  



[url=]

//********************************************************************************

//////////////////////////////////////////////////////////////////////////////////   

//////////////////////////////////////////////////////////////////

#if 1
#pragma import(__use_no_semihosting)            
              
struct __FILE
{
int handle;
};
FILE __stdout;      

void _sys_exit(int x)
{
x = x;
}

int fputc(int ch, FILE *f)
{  
while((USART3->SR&0X40)==0);//Ñ »··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï   
USART3->DR = (u8) ch;      
return ch;
}
#endif

#if EN_USART3_RX   //Èç¹ûʹÄÜÁ˽ÓÊÕ


u8 USART_RX_BUF[USART_REC_LEN];     //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
//½ÓÊÕ״̬
//bit15£¬ ½ÓÊÕÍê³É±êÖ¾
//bit14£¬ ½ÓÊÕµ½0x0d
//bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
u16 USART_RX_STA=0;       //½ÓÊÕ״̬±ê¼Ç
//³õʼ»¯IO ´®¿Ú3
//bound:²¨ÌØÂÊ
void uart_init(u32 bound){
   //GPIO¶Ë¿ÚÉèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //ʹÄÜGPIOBʱÖÓ
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//ʹÄÜUSART3ʱÖÓ

//´®¿Ú3¶ÔÓ¦Òý½Å¸´ÓÃÓ³Éä
GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3); //GPIOB10¸´ÓÃΪUSART3
GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3); //GPIOB11¸´ÓÃΪUSART3

//USART3¶Ë¿ÚÅäÖÃ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; //GPIOB10ÓëGPIOB11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //ËÙ¶È50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ
GPIO_Init(GPIOB,&GPIO_InitStructure); //³õʼ»&macrB10£&notB11
   //USART1 ³õʼ»¯ÉèÖÃ
USART_InitStructure.USART_BaudRate = bound;//²¨ÌØÂÊÉèÖÃ
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(USART3, &USART_InitStructure); //³õʼ»¯´®¿Ú2

  USART_Cmd(USART3, ENABLE);  //ʹÄÜ´®¿Ú2

//USART_ClearFlag(USART3, USART_FLAG_TC);

#if EN_USART3_RX
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//¿ªÆôÏà¹ØÖжÏ
//Usart3 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;//´®¿Ú2ÖжÏͨµÀ
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//ÇÀÕ¼ÓÅÏȼ¶3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;  //×ÓÓÅÏȼ¶3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQͨµÀʹÄÜ
NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷¡¢
#endif

}

void USART3_IRQHandler(void)                 //´®¿Ú2ÖжϷþÎñ³ÌÐò
{
u8 Res;
#if SYSTEM_SUPPORT_OS   //Èç¹ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§³ÖOS.
OSIntEnter();   
#endif
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)
{
  Res =USART_ReceiveData(USART3);//(USART3->DR); //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
  
  if((USART_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É
  {
   if(USART_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d
   {
    if(Res!=0x0a)USART_RX_STA=0;//½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼
    else USART_RX_STA|=0x8000; //½ÓÊÕÍê³ÉÁË
   }
   else //»¹Ã»ÊÕµ½0X0D
   {
    if(Res==0x0d)USART_RX_STA|=0x4000;
    else
    {
     USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
     USART_RX_STA++;
     if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ   
    }   
   }
  }      
  }
#if SYSTEM_SUPPORT_OS  //Èç¹ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§³ÖOS.
OSIntExit();              
#endif
}
#endif

/************************************************************************************************************/
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"

//ALIENTEK ̽Ë÷ÕßSTM32F407¿ª·¢°å ʵÑé4
//´®¿ÚͨÐÅʵÑé -¿âº¯Êý°æ±¾
//¼¼ÊõÖ§³Ö£ºwww.openedv.com
//ÌÔ±¦µêÆÌ£ºhttp://eboard.taobao.com
//¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾  
//×÷ÕߣºÕýµãÔ ×Ó @ALIENTEK

int main(void)
{

u8 t;
u8 len;
u16 times=0;  
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é2
delay_init(168);  //ÑÓʱ³õʼ»¯
uart_init(115200); //´®¿Ú³õʼ»¯²¨ÌØÂÊΪ115200
LED_Init();      //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú  
while(1)
{
  if(USART_RX_STA&0x8000)
  {        
   len=USART_RX_STA&0x3fff;//µÃµ½´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È
   printf("\r\nÄú·¢Ë͵ÄÏûϢΪ:\r\n");
   for(t=0;t<len;t++)
   {
    USART_SendData(USART3, USART_RX_BUF[t]);         //&Iuml;ò&acute;&reg;&iquest;&Uacute;3·&cent;&Euml;&Iacute;&Ecirc;&yacute;&frac34;&Yacute;
    while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//&micro;&Egrave;&acute;&yacute;·&cent;&Euml;&Iacute;&frac12;á&Ecirc;&oslash;
   }
   printf("\r\n\r\n");//&sup2;&aring;&Egrave;&euml;&raquo;&raquo;&ETH;&ETH;
   USART_RX_STA=0;
  }else
  {
   times++;
   if(times%5000==0)
   {
    printf("\r\nALIENTEK &Igrave;&frac12;&Euml;÷&Otilde;&szlig;STM32F407&iquest;&ordf;·&cent;°&aring; &acute;&reg;&iquest;&Uacute;&Ecirc;&micro;&Ntilde;é\r\n");
    printf("&Otilde;&yacute;&micro;&atilde;&Ocirc; ×&Oacute;@ALIENTEK\r\n\r\n\r\n");
   }
   if(times%200==0)printf("&Ccedil;&euml;&Ecirc;&auml;&Egrave;&euml;&Ecirc;&yacute;&frac34;&Yacute;,&Ograve;&Ocirc;&raquo;&Oslash;&sup3;&micro;&frac14;ü&frac12;á&Ecirc;&oslash;\r\n");  
   if(times%30==0)LED0=!LED0;//&Eacute;&Aacute;&Euml;&cedil;LED,&Igrave;á&Ecirc;&frac34;&Iuml;&micro;&Iacute;&sup3;&Otilde;&yacute;&Ocirc;&Uacute;&Ocirc;&Euml;&ETH;&ETH;.
   delay_ms(10);   
  }
}
}

以上这些就是我修改过的文件,其它的没改过。之所以改到串口3,是因为我的电脑上只有COM3与COM4串口。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2016-9-5
在线时间
59 小时
发表于 2020-5-21 14:00:30 | 显示全部楼层
1.“RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE)”这里有错,串口3在APB2下,看看时钟树,别的地方没看。
回复 支持 反对

使用道具 举报

1

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2016-9-5
在线时间
59 小时
发表于 2020-5-21 14:35:10 | 显示全部楼层
纠正:是GPIO使能这句错了。正确是:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
回复 支持 反对

使用道具 举报

16

主题

75

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2018-4-16
在线时间
77 小时
发表于 2020-5-21 14:35:44 | 显示全部楼层
还有 电脑COM3和你这里的USART1或者USART3 没关系
回复 支持 反对

使用道具 举报

16

主题

75

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2018-4-16
在线时间
77 小时
发表于 2020-5-21 14:43:39 | 显示全部楼层
maicolwu 发表于 2020-5-21 14:35
纠正:是GPIO使能这句错了。正确是:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

不要误导别人。。。好好去看看F407的时钟树图,看GPIOB挂在哪条总线上
回复 支持 反对

使用道具 举报

16

主题

75

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2018-4-16
在线时间
77 小时
发表于 2020-5-21 14:46:00 | 显示全部楼层
maicolwu 发表于 2020-5-21 14:35
纠正:是GPIO使能这句错了。正确是:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

时钟树部分截图
1590043494(1).jpg
回复 支持 反对

使用道具 举报

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2019-8-3
在线时间
20 小时
 楼主| 发表于 2020-9-21 16:20:17 | 显示全部楼层
谢谢楼上的朋友的帮助,自从12月31号被这问题受挫之后,我再也没有碰过这个东西了,现在返回来复习下STM32,估计今后还会需要你们的帮助。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-30 08:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表