STM32F429之UART使用

2019-05-25来源: eefocus关键字:STM32F429  UART使用  重定向

#if 1

/// 重定向c库函数printf到USART1

int fputc(int ch, FILE *f)

{

        /* 发送一个字节数据到USART1 */

        USART_SendData(USART1, (uint8_t) ch);

        

        /* 等待发送完毿*/

        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);        

    

        return (ch);

}


/// 重定向c库函数scanf到USART1

int fgetc(FILE *f)

{

        /* 等待串口1输入数据 */

        while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);


        return (int)USART_ReceiveData(USART1);

}

#endif

/*********************************************END OF FILE**********************/

 


USART 只需两根信号线即可完成双向通信,对硬件要求低,使得很多模块都预留USART 接口来实现与其他模块或者控制器进行数据传输,比如 GSM 模块, WIFI 模块、蓝牙模块


  APB2(最高 90MHz)                                     APB1(最高 45MHz)

  USART1 USART6 USART2 USART3 UART4 UART5 UART7 UART8

TX PA9/PB6 PC6/PG14 PA2/PD5 PB10/PD8

/PC10 PA0/PC10 PC12 PF7/PE8 PE1

RX PA10/PB7 PC7/PG9 PA3/PD6 PB11/PD9

/PC11 PA1/PC11 PD2 PF6/PE7 PE0

SCLK PA8 PG7/PC8 PA4/PD7 PB12/PD10

/PC12  

nCTS PA11 PG13/PG15 PA0/PD3 PB13/PD11  

nRTS PA12 PG8/PG12 PA1/PD4 PB14/PD12  

串口1收发数据配置


配合原子的 usmart可以方便的进行调试,使用usmart可以通过串口调用函数,可以传参数非常方便。


 void NVIC_Configuration_1(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

/* 配置 NVIC 为优先级绿1 */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

/* 配置中断源:按键 1 */

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

/* 配置抢占优先级: 1 */

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

/* 配置子优先级_1 */

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;

/* 使能中断通道 */

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

 

void USART1_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

/* config USART1 clock */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

/* USART1 GPIO config */

/* Configure USART1 Tx (PA.09) as alternate function push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);    

/* Configure USART1 Rx (PA.10) as input floating */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* USART1 mode config */

USART_InitStructure.USART_BaudRate = 115200;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

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(USART1, &USART_InitStructure);

NVIC_Configuration_1();

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

USART_Cmd(USART1, DISABLE);

(void)USART1->SR; (void)USART1->DR;

USART_ClearFlag(USART1, USART_FLAG_TC);

USART_ClearITPendingBit(USART1, USART_IT_RXNE);

USART_Cmd(USART1, ENABLE);

 

}

 

 

 

void USART1_IRQHandler_FUN(void)

{

 

u8 data;

 

(void)USART1->SR;   //Error clear;

data = (u8)(USART1->DR & (u16)0x01FF);

USART_ClearITPendingBit(USART1, USART_IT_RXNE);

resevice_buf(data);//

get_buf_usart1[get_usart1_i] = data;

USART_SendData(USART1, data);

get_usart1_i++;

if(get_buf_usart1[0] != 0xFF)

{

get_usart1_i=0;

}

if(get_usart1_i==4)

{

AnalizingBuf2();

get_usart1_i = 0;

gRxHostBufferFlush(4,get_buf_usart1);

}

}

/// 重定向c库函数printf到USART1

int fputc(int ch, FILE *f)

{

/* 发送一个字节数据到USART1 */

USART_SendData(USART1, (uint8_t) ch);

/* 等待发送完毿*/

while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

return (ch);

}

 

/// 重定向c库函数scanf到USART1

int fgetc(FILE *f)

{

/* 等待串口1输入数据 */

while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);

 

return (int)USART_ReceiveData(USART1);

}


 


使用USART1进行串口调试,打印信息到电脑


程序是如何找到中断服务程序呢?在启动文件startup_stm32f10x_md.s中有这样一段代码,汇编DCD USART1_IRQHandler 


stm32串口调试是一个很好的方法


一般有4个上的串口,可以将printf函数重定向到一个UART。这样就可以用printf函数将单片机的数据打印到PC上的超级终端或串口调试助手。


可以通过串口发送一些参数方便调试,可以用一个协议易于操作


 


//定义一个协议,关于数据收发的

//第一位:判断数据是否正确

//第二位:判断数据是否正确

//第三位:存放参数多少

//第四位:参数[1]

//第五位:参数[2]

//第n位:参数[n]

/*

Buffur_Full接受完毕标志位,意思可以解析程序了

*/

 

char get_From_PC[64];

bool Buffur_Full = FALSE;//定义成全局变量

char buf[64];//定义成全局变量

int buf_conut =0

 

void DEBUG_USART_IRQHandler(void)

{

    uint8_t ucTemp;

 

    if (USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) {

        buf[buf_conut++] = USART_ReceiveData( USART1 );

        PacketCheck();

    }

}

void BufferFlush(u32 BufferSize){

    for(u32 counter=0; counter

}

void PacketCheck(void)

{

    int para_length = 0;

    //Header Check

    if(buf[0]!=0xff){ BufferFlush(buf_conut); buf_conut=0; return; }

    else if(buf_conut==1) return;

        if(buf[1]!=0xff){ BufferFlush(buf_conut); buf_conut=0; return; }

        else if(buf_conut==2) return;

    

    if(buf_conut>2)

    {    

        para_length = buf[2];

        if(buf_conut - 2> para_length)

        {

            for(int i= 0;i

            {

                get_From_PC[i] = buf[i+3];

            }

        }

        if(buf_conut == para_length +2)

        {

            Buffur_Full = TURE;

            gRxHostBufferFlush(buf_conut);

            buf_conut = 0;

        }

    }

 

}

 


 


 


/*

嵌套向量中断控制器 NVIC 配置

中断控制器 NVIC 配置

*/

static void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

/* 嵌套向量中断控制器组选择 */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

/* 配置 USART 为中断源 */

NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;

/* 抢断优先级为 1 */

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

/* 子优先级为 1 */

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

/* 使能中断 */

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

/* 初始化配置 NVIC */

NVIC_Init(&NVIC_InitStructure);

}

 


工作模式配置

//USART 初始化配置

void Debug_USART_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

/* 使能 USART GPIO 时钟 */

RCC_AHB1PeriphClockCmd(DEBUG_USART_RX_GPIO_CLK |

DEBUG_USART_TX_GPIO_CLK,

ENABLE);

/* 使能 USART 时钟 */

RCC_APB2PeriphClockCmd(DEBUG_USART_CLK, ENABLE);

/* GPIO 初始化 */

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

/* 配置 Tx 引脚为复用功能 */

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_PIN ;

GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

/* 配置 Rx 引脚为复用功能 */

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_PIN;

GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);

/* 连接 PXx 到 USARTx_Tx*/

GPIO_PinAFConfig(DEBUG_USART_RX_GPIO_PORT,

DEBUG_USART_RX_SOURCE,

DEBUG_USART_RX_AF);

/* 连接 PXx 到 USARTx__Rx*/

GPIO_PinAFConfig(DEBUG_USART_TX_GPIO_PORT,

DEBUG_USART_TX_SOURCE,

DEBUG_USART_TX_AF);

/* 配置串 DEBUG_USART 模式 */

/* 波特率设置: DEBUG_USART_BAUDRATE */

USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;

/* 字长(数据位+校验位): 8 */

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

/* 停止位: 1 个停止位 */

USART_InitStructure.USART_StopBits = USART_StopBits_1;

/* 校验位选择:不使用校验 */

USART_InitStructure.USART_Parity = USART_Parity_No;

/* 硬件流控制:不使用硬件流 */

USART_InitStructure.USART_HardwareFlowControl =

USART_HardwareFlowControl_None;

/* USART 模式控制:同时使能接收和发送 */

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

/* 完成 USART 初始化配置 */

USART_Init(DEBUG_USART, &USART_InitStructure);

/* 嵌套向量中断控制器 NVIC 配置 */

NVIC_Configuration();

/* 使能串口接收中断 */

USART_ITConfig(DEBUG_USART, USART_IT_RXNE, ENABLE

/* 使能串口 */

USART_Cmd(DEBUG_USART, ENABLE);

}

GPIO_PinAFConfig 函数接收三个参数,第一个参数为 GPIO 端口,比如 GPIOA;第二个参数是指定要复用的引脚号,比如 GPIO_PinSource10;第三个参数是选择复用外设,比如 GPIO_AF_USART1。该函数最终操作

[1] [2]
关键字:STM32F429  UART使用  重定向 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic462879.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32F429之 嵌套向量中断控制器NVIC
下一篇:STM32 时钟RCC相关配置参考stm32f10x_rcc.h

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32入门——跑马灯(基于stm32f103zet6)
的驱动都要使能相应的时钟,首先看stm32系统的时钟框图经查阅资料可知,GPIO的时钟在APB2的外设时钟使能寄存器上,相关函数的定义在stm32f10x_rcc.h中 void   RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)其源代码为:void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState){  /* Check the parameters */ //检查值的有效性&nbs
发表于 2019-10-21
stm32入门——跑马灯(基于stm32f103zet6)
stm32入门——跑马灯(基于stm32f103zet6)
的驱动都要使能相应的时钟,首先看stm32系统的时钟框图经查阅资料可知,GPIO的时钟在APB2的外设时钟使能寄存器上,相关函数的定义在stm32f10x_rcc.h中 void   RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)其源代码为:void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState){  /* Check the parameters */ //检查值的有效性&nbs
发表于 2019-10-21
stm32入门——跑马灯(基于stm32f103zet6)
STM32F103流水灯实验
#include "led.h"//初始化PB5和PE5为输出口.并使能这两个口的时钟     //LED IO初始化void LED_Init(void){  GPIO_InitTypeDef  GPIO_InitStructure;  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE); //使能PB,PE端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8
发表于 2019-10-19
STM32F4 SPI2初始化及收发数据【使用库函数】
我的STM32F4 Discovery上边有一个加速度传感器LIS302DL。在演示工程中,ST的工程师使用这个传感器做了个很令人羡慕的东西:解算开发板的姿态。当开发板倾斜时候,处于最上边的LED点亮,其他LED不亮。同时,用MicroUSB数据线将开发板连接电脑时,开发板就会虚拟成一个鼠标。倾斜开发板时,鼠标指针会向倾斜的方向移动。归根结底,就是牛B的ST工程师用加速度传感器完成了姿态解算。在开发板上,加速度传感器使用了SPI方式用STM32F4芯片进行通信。STM32F4的SPI1 作为主机,与LIS302Dl进行通信,读取或者写入数据。由于我没有使用过STM32的SPI口,因此在板子的空余资源中找到了SPI2接口来做实验
发表于 2019-10-19
使用STM32CubeMX,生成STM32F103ZE SPI3 HAL 工程
1,选择芯片型号为STM32F103ZET6,开始工程,引脚配置如下:主要是RCC,SPI3,和SYS三个模块2,时钟配置,可按下图进行:3,SPI3配置,如下图,配完这一步其它可以不管,直接生成工程。4,生成工程,打开工程手动输入红框中内容。运行:成功输出波形。
发表于 2019-10-18
使用STM32CubeMX,生成STM32F103ZE SPI3 HAL 工程
STM32F103xC 之 SPI 引脚分解
芯片:STM32F103RCT6 (64pin ,256K ,LQFP ,-40~85)对象:spiSPI1连接在APB2总线上;SPI2/3连接在APB1总线上;串行外设接口(SPI)在全双工和单工通信模式下,多达三个SPI能够在从属模式和主模式下以高达18 Mbits / s的速度进行通信。 3位预分频器提供8个主模式频率,并且帧可配置为8位或16位。 硬件CRC生成/验证支持基本的SD卡/ MMC模式。所有SPI都可以由DMA控制器提供服务。内部集成I2S两个标准的I2S接口(与SPI2和SPI3复用)可用,可以在主模式或从模式下运行。 这些接口可以配置为以16/32位分辨率工作,作为输入或输出通道。 支持8 kHz至48
发表于 2019-10-18
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved