你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32F4探索套件】序列之6:串口程序

[复制链接]
outstanding1573 提问时间:2014-3-16 22:31 /
 本节我们将串口简介、串口原理、硬件设计、软件设计和下载验证5部分来分析,主要是从下面5个方面进行讲解:
1.STM32F4串口部分介绍

2.STM32F429简单串口原理介绍

3.硬件设计

4.软件设计

5.下载验证

一、串口的简介【通用同步异步收发器 USART

实现功能:上电一直打印一串字符串。下面简单介绍一下USART的特性:



二、简单介绍原理

通信使用 根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。

STM32fF429引脚:

RXD -- PA10 接收数据线

TXD -- PA9  发送数据线

串口软件编写的一般步骤:

(a) 串口时钟使能,GPIO时钟使能

(b) 串口复位

(c) GPIO端口模式设置

(d) 串口参数初始化

(e) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)

(f) 使能串口

(g) 编写串口中断处理函数

为了更好了解固件库在串口配置中的使用,下面简单介绍几个与串口有关的固件库函数。这些函数和定义主要在stm32f4xx_usart.c 和 stm32f4xx_usart.h 中。

(a) 串口时钟使能函数。USART挂载在APB2总线上,所以使能函数为:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );

(b) 串口复位函数。当外设出现异常的时候可以通过复位设置,实现该外设的复位,然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外设才做。复位是在函数USART_DeInit()完成。

USART_DeInit(USART_TypeDef* USARTx)

(c) 串口参数初始化。串口初始化是通过USART_Init()函数来实现的。

USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)

(d) 数据发送与接收。STM32 的发送与接收是通过数据寄存器 USART_RDRUSART_TDR来实现的,当向USART_TDR寄存器写数据的时候,串口就会自动发送数据,当收到数据的时候,就存储在USART_RDR寄存器中。

STM32 库函数操作 USART_TDR 寄存器发送数据的函数是:

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)

通过该函数可以向串口寄存器写一个数据。

STM32 库函数操作 USART_RDR 寄存器读取串口接收到的数据的函数是:

uint16_t USART_ReceiveData(USART_TypeDef* USARTx)

通过该函数可以读取串口接受到的数据。

(e) 串口状态。

读取串口状态的函数是:

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)

第二个入口参数非常关键,它是我们要查看串口的哪种状态。

(f) 串口使能。串口使能是通过函数USART_Cmd()来实现的。

void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)

(g) 开启串口响应中断。有时候当我们还需要开启串口中断,那么我们还需要使能串口中断,使能串口中断的函数是:

void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)

(h) 获取相应的中断状态。当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。 经常我们在中断处理函数中,要判断该中断是哪种中断,使用的函数是:

ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)

具体可以参考《STM32F030参考手册》。

三、硬件设计



硬件比较简单就是两个引脚!!

四、软件设计

软件是参考网上的一个程序,等下传上附件!!!

void uart_init(u32 bound){

    //GPIO端口设置

    GPIO_InitTypeDef GPIO_InitStructure;

        USART_InitTypeDef USART_InitStructure;

        NVIC_InitTypeDef NVIC_InitStructure;

         

          /* Enable GPIOC and GPIOE clock */

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA , ENABLE);

       

          /* Enable USART1 APB clock */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

          /* USART1 Pins configuration ************************************************/

  /* Connect pin to Periph */

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);   

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

       

  /* Configure pins as AF pushpull */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  GPIO_Init(GPIOA, &GPIO_InitStructure);             //TX

  

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  GPIO_Init(GPIOA, &GPIO_InitStructure);             //RX

 

   //Usart1 NVIC 配置

 

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能

        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器

  

   //USART 初始化设置

 

        USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;

        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(USART1, &USART_InitStructure); //初始化串口

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断

    USART_Cmd(USART1, ENABLE);                    //使能串口

 

}

void USART1_IRQHandler(void)                        //串口1中断服务程序

        {

        u8 Res;

#ifdef OS_TICKS_PER_SEC                 //如果时钟节拍数定义了,说明要使用ucosII.

        OSIntEnter();   

#endif

        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)

                {

                Res =USART_ReceiveData(USART1);//(USART1->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;//接收数据错误,重新开始接收          

                                        }                 

                                }

                        }                    

     }

#ifdef OS_TICKS_PER_SEC                 //如果时钟节拍数定义了,说明要使用ucosII.

        OSIntExit();                                                                                           

#endif

}

五、下载验证



整个程序在附件里面,希望大家验证!!!

 

stm32f429 USART.zip

下载

564.26 KB, 下载次数: 485, 下载积分: ST金币 -1

收藏 评论56 发布时间:2014-3-16 22:31

举报

56个回答
魔方奇才 回答时间:2015-2-2 20:06:50
请教一下楼主,F429DISCOVERY的PA9和PA10并没有通过电平转换芯片连接到上位机,这个怎么解决的?
mccl 回答时间:2015-7-9 11:17:08
感觉PA9跟PA10在接了st-link的情况下不能用,同样的程序改为PB6,7就可以。
mccl 回答时间:2015-7-8 11:25:06
很详细,谢谢!
沐紫 回答时间:2014-3-17 11:14:22

RE:【STM32F4探索套件】序列之6:串口程序

多谢!可是看到1.2.6了,求楼主序列3.4.5!
outstanding1573 回答时间:2014-3-17 15:28:40

回复:【STM32F4探索套件】序列之6:串口程序

昨晚发了  今天一看没有了 奇怪,晚上再发试试看 
沐紫 回答时间:2014-3-17 15:42:22

回复:【STM32F4探索套件】序列之6:串口程序

回复第 3 楼 于2014-03-17 15:28:40发表:
昨晚发了  今天一看没有了 奇怪,晚上再发试试看 

 

记得上次你说也出现过这个情况,可是我在后台没有看到你的帖子被误删或者屏蔽
971023 回答时间:2014-3-17 18:58:26

回复:【STM32F4探索套件】序列之6:串口程序

 收下了,感謝
outstanding1573 回答时间:2014-3-17 23:51:28

回复:【STM32F4探索套件】序列之6:串口程序

互相学习 
outstanding1573 回答时间:2014-3-17 23:51:58

回复:【STM32F4探索套件】序列之6:串口程序

是的  ,现在再发一篇试试看
outstanding1573 回答时间:2014-3-18 08:51:26

回复:【STM32F4探索套件】序列之6:串口程序

昨晚发的一篇又不行 
outstanding1573 回答时间:2014-3-18 08:52:33

回复:【STM32F4探索套件】序列之6:串口程序

昨晚发的一篇又不行,另外几篇也不行,有篇说有违规词 
gdj204sxl 回答时间:2014-3-24 13:47:18

RE:【STM32F4探索套件】序列之6:串口程序

值得学习 下载看看
pchf005-126481 回答时间:2014-3-27 15:17:57

RE:【STM32F4探索套件】序列之6:串口程序

值得学习 下载看看
大天津 回答时间:2014-4-3 14:02:04

RE:【STM32F4探索套件】序列之6:串口程序

学习了很好,谢谢!
jinglixixi 回答时间:2014-4-4 09:11:48

回复:【STM32F4探索套件】序列之6:串口程序

认真学习学习,谢谢.
jinglixixi 回答时间:2014-4-4 10:03:48

回复:【STM32F4探索套件】序列之6:串口程序

文件的格式是什么?解压后无法打开呀?
joybe 回答时间:2014-4-7 09:49:40

RE:【STM32F4探索套件】序列之6:串口程序

非常棒,谢谢了,啊哈哈哈
1234下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版