OpenEdv-开源电子网

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

[miniF103] 分享:mini板子串口4的使用:MINI+UART4 用杜邦线PC10接RXD PC11接TXD

[复制链接]

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-7-19 20:21:32 | 显示全部楼层 |阅读模式
本帖最后由 1208 于 2019-4-16 17:23 编辑

修改不同串口的程序,要怎么做
1)第一步先要看原理图明确串口4对应PC10,PC11的引脚
  以及使能GPIOC的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
串口4.png
2)在重定义fputc函数里面对应好串口4
int fputc(int ch, FILE *f)
{      
    while((USART4->SR&0X40)==0);//循环发送,直到发送完毕   
    USART4->DR = (u8) ch;      
    return ch;
}
3)串口4需要用两根杜邦线对应连接
串口4 UART4_TX   PC10对应RXD
串口4 UART4_RX   PC11对应TXD
4)其它的对照串口1例程修改成串口4就行

[mw_shl_code=c,true]void uart_init(u32 bound){
  //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
  
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE); //使能UART4时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能GPIOC时钟
//UART4_TX   GPIOC.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PC10接RXD
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC.10
   
  //UART4_RX   GPIOC.11初始化0
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PC11接TXD
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC.11  
  //Uart4 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn ;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //子优先级3
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
   NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
  
   //UART 初始化设置
   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(UART4, &USART_InitStructure); //初始化串口4
   USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//开启串口接受中断
   USART_Cmd(UART4, ENABLE);                    //使能串口4
}[/mw_shl_code]



MINI+UART4 PC10接RXD PC11接TXD.rar

1.86 MB, 下载次数: 1026

业精于勤荒于嬉;行成于思毁于随!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
 楼主| 发表于 2019-4-17 18:28:59 | 显示全部楼层
743的串口4
将对应的USART1改为UART4

用杜邦线将TXD对应PA11,RXD对应PA12


743 串口4通信实验.zip

21.23 MB, 下载次数: 128

业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
发表于 2018-11-8 17:17:52 | 显示全部楼层
您好,能帮我看一下我配置的UART4 和UART5哪里有问题吗
回复 支持 反对

使用道具 举报

19

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-9-3
在线时间
50 小时
发表于 2018-11-8 17:24:08 | 显示全部楼层
[mw_shl_code=c,true]#include "sys.h"
#include "usart.h"          
#pragma import(__use_no_semihosting_swi)

int SER_PutChar (int c) {

#ifdef __DBG_ITM
    ITM_SendChar(c);
#else
  while (!(USART2->SR & USART_SR_TXE));
  USART2->DR = (c & 0x1FF);
#endif
  return (c);
}

struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;
FILE __stderr;


int fputc(int c, FILE *f) {
  if (c == '\n')  {
    SER_PutChar('\r');
  }
  return (SER_PutChar(c));
}

void My_USART_Init(void)
{

       
        GPIO_InitTypeDef GPIO_A_InitStrue;
        GPIO_InitTypeDef GPIO_B_InitStrue;
        GPIO_InitTypeDef GPIO_C_InitStrue;
        GPIO_InitTypeDef GPIO_D_InitStrue;
       
       
       
       
        USART_InitTypeDef USART_1_InitStrue;
        USART_InitTypeDef USART_2_InitStrue;
        USART_InitTypeDef USART_3_InitStrue;
        USART_InitTypeDef UART_4_InitStrue;
        USART_InitTypeDef UART_5_InitStrue;
       
       
       
        NVIC_InitTypeDef NVIC_1_InitStrue;
        NVIC_InitTypeDef NVIC_2_InitStrue;
        NVIC_InitTypeDef NVIC_3_InitStrue;
        NVIC_InitTypeDef NVIC_4_InitStrue;
        NVIC_InitTypeDef NVIC_5_InitStrue;
       
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_USART1,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB1Periph_USART3|RCC_APB1Periph_UART4|RCC_APB1Periph_UART5,ENABLE);
       
        GPIO_A_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_A_InitStrue.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_9;
        GPIO_A_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOA,&GPIO_A_InitStrue);
       
        GPIO_A_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_A_InitStrue.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_10;
        GPIO_A_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOA,&GPIO_A_InitStrue);
       
        //配置B口
        GPIO_B_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_B_InitStrue.GPIO_Pin=GPIO_Pin_10;
        GPIO_B_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOB,&GPIO_B_InitStrue);
       
        GPIO_B_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_B_InitStrue.GPIO_Pin=GPIO_Pin_11;
        GPIO_B_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOB,&GPIO_B_InitStrue);
       
        //配置C口
       
        GPIO_C_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_C_InitStrue.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_12;
        GPIO_C_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOC,&GPIO_C_InitStrue);
       
        GPIO_C_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_C_InitStrue.GPIO_Pin=GPIO_Pin_11;
        GPIO_C_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOC,&GPIO_C_InitStrue);
        //配置D口
       
       
        GPIO_D_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_D_InitStrue.GPIO_Pin=GPIO_Pin_2;
        GPIO_D_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOD,&GPIO_D_InitStrue);
       
        //串口1配置
       
        USART_1_InitStrue.USART_BaudRate=9600;
        USART_1_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_1_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
        USART_1_InitStrue.USART_Parity=USART_Parity_No;
        USART_1_InitStrue.USART_StopBits=USART_StopBits_1;
        USART_1_InitStrue.USART_WordLength=USART_WordLength_8b;
        USART_Init(USART1,&USART_1_InitStrue);
       
        //串口2配置
       
        USART_2_InitStrue.USART_BaudRate=9600;
        USART_2_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_2_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
        USART_2_InitStrue.USART_Parity=USART_Parity_No;
        USART_2_InitStrue.USART_StopBits=USART_StopBits_1;
        USART_2_InitStrue.USART_WordLength=USART_WordLength_8b;
        USART_Init(USART2,&USART_2_InitStrue);
       
        //串口3配置
        USART_3_InitStrue.USART_BaudRate=9600;
        USART_3_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_3_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
        USART_3_InitStrue.USART_Parity=USART_Parity_No;
        USART_3_InitStrue.USART_StopBits=USART_StopBits_1;
        USART_3_InitStrue.USART_WordLength=USART_WordLength_8b;
        USART_Init(USART3,&USART_3_InitStrue);
        //串口4配置
        UART_4_InitStrue.USART_BaudRate=9600;
        UART_4_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        UART_4_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
        UART_4_InitStrue.USART_Parity=USART_Parity_No;
        UART_4_InitStrue.USART_StopBits=USART_StopBits_1;
        UART_4_InitStrue.USART_WordLength=USART_WordLength_8b;
        USART_Init(UART4,&UART_4_InitStrue);
        //串口5配置
        UART_5_InitStrue.USART_BaudRate=9600;
        UART_5_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        UART_5_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
        UART_5_InitStrue.USART_Parity=USART_Parity_No;
        UART_5_InitStrue.USART_StopBits=USART_StopBits_1;
        UART_5_InitStrue.USART_WordLength=USART_WordLength_8b;
        USART_Init(UART5,&UART_5_InitStrue);
        //串口使能
       
        USART_Cmd(USART1,ENABLE);
        USART_Cmd(USART2,ENABLE);
        USART_Cmd(USART3,ENABLE);
        USART_Cmd(UART4,ENABLE);
        USART_Cmd(UART5,ENABLE);
       
        //判断串口是否触发接受
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
        USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
        USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);
        USART_ITConfig(UART5,USART_IT_RXNE,ENABLE);
       
        //中断配置
       
       
        NVIC_1_InitStrue.NVIC_IRQChannel=USART1_IRQn;
        NVIC_1_InitStrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_1_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_1_InitStrue.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_1_InitStrue);
       
       
       
        NVIC_2_InitStrue.NVIC_IRQChannel=USART2_IRQn;
        NVIC_2_InitStrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_2_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_2_InitStrue.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_2_InitStrue);
       
        NVIC_3_InitStrue.NVIC_IRQChannel=USART3_IRQn;
        NVIC_3_InitStrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_3_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_3_InitStrue.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_3_InitStrue);
       
       
        NVIC_4_InitStrue.NVIC_IRQChannel=UART4_IRQn;
        NVIC_4_InitStrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_4_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_4_InitStrue.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_4_InitStrue);
       
        NVIC_5_InitStrue.NVIC_IRQChannel=UART5_IRQn;
        NVIC_5_InitStrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_5_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_5_InitStrue.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_5_InitStrue);
       
       
       
}


void USART1_IRQHandler(void)
{
        u8 Res;
         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
                {
                Res =USART_ReceiveData(USART1);       
    Res++;
                USART_SendData(USART1, Res);
                       
     }
}
void USART2_IRQHandler(void)
{
        u8 Res;
         if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
                {
                Res =USART_ReceiveData(USART2);       
    Res++;
                USART_SendData(USART2, Res);
                       
     }
}void USART3_IRQHandler(void)
{
        u8 Res;
         if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
                {
                Res =USART_ReceiveData(USART3);       
    Res++;
                USART_SendData(USART3, Res);
                       
     }
}void UART4_IRQHandler(void)
{
        u8 Res;
         if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
                {
                Res =USART_ReceiveData(UART4);       
    Res++;
                USART_SendData(UART4, Res);
                       
     }
}



void UART5_IRQHandler(void)
{
        u8 Res;
         if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)
                {
                Res =USART_ReceiveData(UART5);       
    Res++;
                USART_SendData(UART5, Res);
                       
     }
}
[/mw_shl_code]
回复 支持 反对

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
 楼主| 发表于 2018-11-8 19:05:09 | 显示全部楼层
看了一下配置,问题不大,你是在做什么来的
你加下这个串口1到串口5
int fputc(int ch, FILE *f)
{      
        while((UART5->SR&0X40)==0);//循环发送,直到发送完毕   
    UART5->DR = (u8) ch;      
        return ch;
}
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

8

主题

155

帖子

0

精华

高级会员

Rank: 4

积分
743
金钱
743
注册时间
2011-11-12
在线时间
152 小时
发表于 2018-11-9 11:58:14 | 显示全部楼层
1208 发表于 2018-11-8 19:05
看了一下配置,问题不大,你是在做什么来的
你加下这个串口1到串口5
int fputc(int ch, FILE *f)

楼主,我也用的UART4,配置和你的一样,就是接收不到数据,好像没进串口中断

// 串口中断4服务函数
void DEBUG_USART4_IRQHandler(void)
{       
        if(USART_GetITStatus(DEBUG_USART4,USART_IT_RXNE)!=RESET)
        {
                Uart4_RecData[Uart4_RecNumCount++] = USART_ReceiveData(DEBUG_USART4);
        }
        USART_ClearITPendingBit(DEBUG_USART4, USART_IT_RXNE);     
}
回复 支持 反对

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
 楼主| 发表于 2018-11-9 12:01:22 | 显示全部楼层
BowenQQ 发表于 2018-11-9 11:58
楼主,我也用的UART4,配置和你的一样,就是接收不到数据,好像没进串口中断

// 串口中断4服务函数

程序一样也不行吗
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

8

主题

155

帖子

0

精华

高级会员

Rank: 4

积分
743
金钱
743
注册时间
2011-11-12
在线时间
152 小时
发表于 2018-11-9 12:40:43 | 显示全部楼层
1208 发表于 2018-11-9 12:01
程序一样也不行吗

不行呢,郁闷中。。。
回复 支持 反对

使用道具 举报

8

主题

155

帖子

0

精华

高级会员

Rank: 4

积分
743
金钱
743
注册时间
2011-11-12
在线时间
152 小时
发表于 2018-11-9 12:49:28 | 显示全部楼层
1208 发表于 2018-11-9 12:01
程序一样也不行吗

对了,楼主,我这发送正常,就是接收不到数据,我用两块板子,A板子(探索者407的USART1)的TXD接B板子(我的板子F103ZET6的UART4)的RXD,A板子的RXD接B板子的TXD,也共地了,我板子接收不到探索者板子发送的数据(我让探索者发送的“OK”)
回复 支持 反对

使用道具 举报

13

主题

633

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1331
金钱
1331
注册时间
2016-8-1
在线时间
229 小时
发表于 2018-11-9 13:37:35 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
 楼主| 发表于 2018-11-9 15:05:05 | 显示全部楼层
BowenQQ 发表于 2018-11-9 12:40
不行呢,郁闷中。。。

我这个程序可是在板子测试过是没问题的
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
 楼主| 发表于 2018-11-9 15:32:00 | 显示全部楼层
BowenQQ 发表于 2018-11-9 12:49
对了,楼主,我这发送正常,就是接收不到数据,我用两块板子,A板子(探索者407的USART1)的TXD接B板子( ...

这样的模式我还没试过
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

8

主题

155

帖子

0

精华

高级会员

Rank: 4

积分
743
金钱
743
注册时间
2011-11-12
在线时间
152 小时
发表于 2018-11-9 16:11:35 | 显示全部楼层
1208 发表于 2018-11-9 15:32
这样的模式我还没试过

好的,感谢楼主回复,我再研究下
回复 支持 反对

使用道具 举报

0

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2018-2-28
在线时间
76 小时
发表于 2019-3-16 13:04:01 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-5 10:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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