STM32F407 上手-USART 收发数据

2019-07-22来源: eefocus关键字:STM32F407  USART  收发数据

研究了一下KEIL的MDK以及它的文档


一般习惯性的都从串口开始做 hello world!  


总结一下,KEIL的入门要比arduino要复杂的多,arduino是为硬件小白及非专业人士准备的。但是它的功能并不弱。




KEIL入门请一定要认真花点时间看一下它的文档,我是用这份文档入门的(http://www2.keil.com/docs/default-source/default-document-library/mdk5-getting-started.pdf?sfvrsn=0)


原以为找个hello world例子就可以轻松入门,后来发现错了。所以认认真真去看完了上面的文档。




不多说了,上面的文档很专业,看完就足够入门了。


我把例子放给大家,官方的例子在我的板子上运行有问题(只能发送一次),做了一些改动




#include "Driver_USART.h"

 

extern ARM_DRIVER_USART Driver_USART2;

 

 

/*----------------------------------------------------------------------------

 * Application main thread

 *---------------------------------------------------------------------------*/

void myUART_Thread(void const *argument);

osThreadId_t tid_myUART_Thread;

osEventFlagsId_t evt_id ;

#define FLAGS_MSK1 0x00000001ul

void myUSART_callback(uint32_t event)

{

//  uint32_t mask; 以下几行原有代码被注释掉

//  mask = ARM_USART_EVENT_RECEIVE_COMPLETE  |

//         ARM_USART_EVENT_TRANSFER_COMPLETE |

//         ARM_USART_EVENT_SEND_COMPLETE     |

//         ARM_USART_EVENT_TX_COMPLETE       ;

  //if (event & mask) 

{

    /* Success: Wakeup Thread */

if( event & ARM_USART_EVENT_TX_COMPLETE )//新增加代码

osEventFlagsSet(evt_id, ARM_USART_EVENT_TX_COMPLETE);

if( event & ARM_USART_EVENT_RECEIVE_COMPLETE )

osEventFlagsSet(evt_id, ARM_USART_EVENT_RECEIVE_COMPLETE);

    //osEventFlagsSet(evt_id, FLAGS_MSK1);

  }

//  if (event & ARM_USART_EVENT_RX_TIMEOUT) {

//    __breakpoint(0);  /* Error: Call debugger or replace with custom error handling */

//  }

//  if (event & (ARM_USART_EVENT_RX_OVERFLOW | ARM_USART_EVENT_TX_UNDERFLOW)) {

//    __breakpoint(0);  /* Error: Call debugger or replace with custom error handling */

//  }

}

void app_main (void *argument) {

 

static ARM_DRIVER_USART * USARTdrv = &Driver_USART2;

    ARM_DRIVER_VERSION     version;

    ARM_USART_CAPABILITIES drv_capabilities;

    char                   cmd;

 

  #ifdef DEBUG

    version = USARTdrv->GetVersion();

    if (version.api < 0x200)   /* requires at minimum API version 2.00 or higher */

    {                          /* error handling */

        return;

    }

    drv_capabilities = USARTdrv->GetCapabilities();

    if (drv_capabilities.event_tx_complete == 0)

    {                          /* error handling */

        return;

    }

  #endif

 

    /*Initialize the USART driver */

    USARTdrv->Initialize(myUSART_callback);

    /*Power up the USART peripheral */

    USARTdrv->PowerControl(ARM_POWER_FULL);

    /*Configure the USART to 4800 Bits/sec */

    USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |

                      ARM_USART_DATA_BITS_8 |

                      ARM_USART_PARITY_NONE |

                      ARM_USART_STOP_BITS_1 |

                      ARM_USART_FLOW_CONTROL_NONE, 4800);

     

    /* Enable Receiver and Transmitter lines */

    USARTdrv->Control (ARM_USART_CONTROL_TX, 1);

    USARTdrv->Control (ARM_USART_CONTROL_RX, 1);

  evt_id = osEventFlagsNew(NULL);

 

    USARTdrv->Send("nPress Enter to receive a message", 34);

    //osSignalWait(0x01, osWaitForever);

osEventFlagsWait(evt_id,ARM_USART_EVENT_TX_COMPLETE,osFlagsWaitAny, osWaitForever);//修改过

     

    while (1)

    {

cmd = 0;//新增

        USARTdrv->Receive(&cmd, 1);          /* Get byte from UART */

        osEventFlagsWait(evt_id,ARM_USART_EVENT_RECEIVE_COMPLETE,osFlagsWaitAny,osWaitForever);//修改过

        if (cmd == 13)                       /* CR, send greeting  */

        {

          USARTdrv->Send("nHello World!", 12);

          osEventFlagsWait(evt_id,ARM_USART_EVENT_TX_COMPLETE,osFlagsWaitAny,osWaitForever);//修改过

        }

 

    }

}

PC端运行截图如下:


关键字:STM32F407  USART  收发数据

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

上一篇:STM32F429HAL库UART学习笔记
下一篇:STM32 UART串口驱动程序

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

推荐阅读

STM32F103控制舵机

//TIM4 PWM部分初始化 //PWM输出初始化//arr:自动重装值//psc:时钟预分频数void TIM4_PWM_Init(u16 arr,u16 psc){   GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; TIM_OCInitTypeDef  TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器3时钟 
发表于 2019-08-23

基于STM32F103ZET6主控平台实现定时器TIM3的驱动

_Clock_Init(9);   //系统时钟设置 delay_init(72);     //延时初始化 uart_init(72,115200); //串口初始化为115200 LED_Init(); BEEP_Init(); TIM3_Init(4999,7199); while(1) { if(Wl_stat==0)//代表进入WHILE循环 { printf("Input While(1)-->rn"); Wl_stat=1; } LED1=!LED1; delay_ms(200); }} 第四步:编译通过后,烧录进STM32F103ZET6开发板,实现
发表于 2019-08-22

STM32f103ZET6定时器TIM3使用通道1输出PWM程序

总结:TIM3_CH1输出口为PA6(重映射为PB4),PB5位DS0接口。1.使用重映射之后,原始IO口不再有输出;本例子中,若使用部分重映射,则 PA6映射到PB4中,所以仅仅PB4有波形输出;飞线连接PB4与PB5即可观察PWM呼吸灯效果。2.使用IO口前务必初始化,本例子中开始仅仅初始化了PB5口,而没有初始化PA6导致一直验证失败;正点原子给出程序中是由通道2直接映射到PB5因此只需要初始化PB5口即可,不存在上述问题。3.除了正常输出输入信号之外,输出PWM以及其他功能均属于IO口的复用功能。#include "stm32f10x.h"#include "led.h"
发表于 2019-08-22

stm32f0设置tim2单脉冲模式-tim1内部触发

/***************************************************************************************************************以下TIM1和TIM2的设置实现TIM1输出40hz,占空比7%即高电平输出180us,TIM2输出单脉冲,周期360us,占空比50%,TIM2的触发是TIM1的OC1REF信号。TIM2设置单脉冲需设置的参数:  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;    TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single);//单脉冲  TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0);//定时器1内部触发 
发表于 2019-08-22
stm32f0设置tim2单脉冲模式-tim1内部触发

STM32F103 使用TIM3产生四路PWM

为PC6、PC7、PC8、PC9*******************************************************************************/#include"stm32f10x.h"void RCC_Cfg(void);void GPIO_Cfg(void);void TIM_Cfg(void);void NVIC_Cfg(void);void delay_ms(u32 i);void PWM_Cfg(float dutyfactor1,float dutyfactor2,float dutyfactor3,float dutyfactor4); int
发表于 2019-08-22
STM32F103 使用TIM3产生四路PWM

STM32F10 OLED液晶显示(IIC)

2019年7月27日做小车的第六天。今天我实现了一个新的功能 OLED显示汉字。刚开始学习这个显示汉字的时候也是一头污水,代码啊大部分看不懂,看OLED讲解的那个视频反复看了好几遍。还是没什么思路。但是那自己慢慢的开始修改自带的源代码,尝试的去做,从显示点、线、字符、字符串一步步的开始进行,随着这个一步步的学会,显示汉字那,哈哈,原理也是差不多。大致思路也就是调用.c中的函数,设置里面的变量,去调出自己想要的字符,汉字的代码(这些代码都是在一个数组里)先说说重要的,怎么显示出汉字:比如我们想让OLED显示屏显示一个字符串:“CODE”,主函数是这么两条语句:OLED_ShowString(63,48,“CODE:”,16
发表于 2019-08-22
STM32F10 OLED液晶显示(IIC)

小广播

何立民专栏

单片机及嵌入式宝典

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

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