datasheet

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://www.eeworld.com.cn/mcu/ic462879.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

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

推荐阅读

STM32F4定时器时钟频率和时钟源

从时钟树中我们可以得知(1)高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线(2)通用定时器timer2~timer5,通用定时器timer12~timer14以及基本定时器timer6,timer7的时钟来源是APB1总线从STM32F4的内部时钟树可知,(1)当APB1和APB2分频数为1的时候,TIM1、TIM8~TIM11的时钟为APB2的时钟,TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟;(2)而如果APB1和APB2分频数不为1,那么TIM1、TIM8~TIM11的时钟为APB2的时钟的两倍,TIM2~TIM7、TIM12
发表于 2019-06-18
STM32F4定时器时钟频率和时钟源

STM32CubeMX开发stm32f103rbt6 CAN例程(二)

1、STM32CubeMX配置    2、生成代码查看  3、编写代码程序下载:http://download.csdn.net/download/white_loong/101374684、使用CAN分析仪测试(波特率125K)问题:程序CAN收发同时打开例如:1、main() {     HAL_CAN_Receive_IT();     HAL_CAN_Transmit_IT(); }  HAL_CAN_RxCpltCallback() { 
发表于 2019-06-18
STM32CubeMX开发stm32f103rbt6 CAN例程(二)

stm32f407之CAN控制器(操作寄存器)

),和can2(从),其中过滤器的设置是通过can1来设置,其他工作模式,波特率等,可以各自设置。每个控制器有三个发送邮箱,两个fifo,每个fifo有三个接收邮箱。发送:选择一个空的发送邮箱,把帧信息写到该发送邮箱的寄存器里,请求发送,控制器就会根据标识符的优先级把帧先后发送出去。接收:如果接收到的帧的标识符能过过滤表的一系列过滤,该帧信息就会保存在fifo接收邮箱的寄存器里。过滤器:stm32f407共有28组过滤器,每组过滤器可以设置关联到fifo0或者fifo1,每组都包括两个32位存储器,可以配置成一个32位有位屏蔽功能的标识符过滤器,或者两个32位完全匹配的标识符过滤器,或者两个16位有位屏蔽功能的标识符过滤器,或者四个16位完全
发表于 2019-06-18
stm32f407之CAN控制器(操作寄存器)

stm32F4 hal库之CAN通信的实现

目标:通过can总线,用stm32的CAN模块实现对电机驱动发送指令,从而实现对电机的控制。硬件设计:①收发芯片的功能:把单片机送来的信号通过收发芯片的转换从而实现信号的具体传输。②120欧终端电阻:主要是为了防止信号的干扰,一般来说,终端设备的CAN_H和CAN_L也要加上120欧终端电阻。软件设计基本知识:其实各种通信方式的本质都是一样的,均分为两个部分;①波特率:以何种速度来通信②具体准则:发送端和接收端对发送来的数据的解释。特色:CAN工作于4种模式;类似于手机的飞行模式,正常模式,待机状态,是一种感觉。CAN常用的工作模式是(1)回环模式:也就是自己发,自己收。(2)正常工作模式,也就是用于正常的接收,发送。一.公共部分
发表于 2019-06-18
stm32F4 hal库之CAN通信的实现

STM32f407的数字采集电路ADC的设计与使用

IN5   AD_CH2_Y    PA6   ADC1 IN6   AD_CH2_X    PA7   ADC1 IN7   */ #ifndef __BSP_ADC_H#define __BSP_ADC_H #include "stm32f4xx.h" #include "stm32f4xx.h" void bsp_InitADC(void);u16 bsp_GetAdValue(u8 chx); 
发表于 2019-06-18

STM32F207运用串口空闲中断+DMA接收不定长数据

;       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);//开启DMA时钟          DMA_InitStructure.DMA_Channel = DMA_Channel_4;//通道4           DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)USART1_DR_Address; //外设地址
发表于 2019-06-18

小广播

何立民专栏

单片机及嵌入式宝典

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

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