STM32 UART2程序--端口重映射

发布者:星尘之泪最新更新时间:2018-06-01 来源: eefocus关键字:STM32  UART2程序  端口重映射 手机看文章 扫描二维码
随时随地手机看文章

USART1程序很多,看看USART2程序。注意红色部分,首先要使能相关端口的时钟。

因为USART2可以映射成不同的端口,所以要端口映射。

结合你自己的开发板,设置正确的映射口.(正点原子的是PA03PA02.)

STM32F103ZE默认的USART2就是PA03PA02,如果配置映射,USART2端口是PD05PD06了。


程序在正点原子开发板SRAM中调试通过,开发环境IAR5.30.


void USART2_Initialise( u32 bound )

{

    GPIO_InitTypeDef GPIO_InitStructure;//I/O¿ú3õê¼»ˉ½á11ìå

    NVIC_InitTypeDef NVIC_InitStructure;//ÖD¶Ï3õê¼»ˉ½á11ìå

    USART_InitTypeDef USART_InitStructure;//′®¿ú3õê¼»ˉ½á11ìå  

    

    /* Enable the USART2 Pins Software Remapping */

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); 

    

    

    /* Configure USART2 Rx (PA.03) as input floating */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;    

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    

    /* Configure USART2 Tx (PA.02) as alternate function push-pull */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    

    /* Enable the USART2 Interrupt */

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);    

    

    USART_InitStructure.USART_BaudRate = bound;                //ò»°ãéèÖÃÎa9600;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½

    USART_InitStructure.USART_StopBits = USART_StopBits_1;     //ò»¸öí£Ö1λ

    USART_InitStructure.USART_Parity = USART_Parity_No;        //ÎTÆæżD£Ñéλ

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//Yá÷¿ØÖÆ

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//êÕ·¢Ä£ê½   

    

    USART_Init(USART2, &USART_InitStructure);

    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

    //USART_ITConfig(USART2, USART_IT_TXE, ENABLE);

    /* Enable USART2 */

    USART_Cmd(USART2, ENABLE);

}

void USART2_IRQHandler(void)  

  

{  

     if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET)  

      {       

              USART_SendData(USART2, USART_ReceiveData(USART2));             

      }

      

}

该程序功能是返回你发送到串口的数据。

如果你的USART2接到PD端口上面了,要修改程序如下,这里就需要端口映射了,映射寄存器是AFIO控制的,它接在APB2时钟区域,所以下面的红色代码必须要有,蓝色代码对端口进行初始化。

void USART2_Initialise( u32 bound )

{

    GPIO_InitTypeDef GPIO_InitStructure;//I/O¿ú3õê¼»ˉ½á11ìå

    NVIC_InitTypeDef NVIC_InitStructure;//ÖD¶Ï3õê¼»ˉ½á11ìå

    USART_InitTypeDef USART_InitStructure;//′®¿ú3õê¼»ˉ½á11ìå  

    

    /* Enable the USART2 Pins Software Remapping */

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD ,ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);    

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

    GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);    

    

    /* Configure USART2 Rx (PD.06) as input floating */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;    

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOD, &GPIO_InitStructure);

    

    /* Configure USART2 Tx (PD.05) as alternate function push-pull */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_Init(GPIOD, &GPIO_InitStructure);

    

    /* Enable the USART2 Interrupt */

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);    

    

    USART_InitStructure.USART_BaudRate = bound;//ò»°ãéèÖÃÎa9600;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½

    USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ

    USART_InitStructure.USART_Parity = USART_Parity_No;//ÎTÆæżD£Ñéλ

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//¾Yá÷¿ØÖÆ

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//êÕ·¢Ä£ê½   

    

    USART_Init(USART2, &USART_InitStructure);

    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

    //USART_ITConfig(USART2, USART_IT_TXE, ENABLE);

    /* Enable USART2 */

    USART_Cmd(USART2, ENABLE);

}

void USART2_IRQHandler(void)  

  

{  

     if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET)  

      {       

              USART_SendData(USART2, USART_ReceiveData(USART2));             

      }

      

}

ST固件库,有方便的地方,写程序很容易,但是有时候理解起来很麻烦,看自己的喜好然后选择吧。


关键字:STM32  UART2程序  端口重映射 引用地址:STM32 UART2程序--端口重映射

上一篇:stm32-串口接受不定长数据方法(3种)
下一篇:STM32串口DMA连续发送两帧,导致数据部分覆盖的问题

推荐阅读最新更新时间:2024-03-16 16:04

STM32 IAR工程->Keil MDK转换详解
我在STM32的学习中发现,大部分的STM32示例程序都是基于IAR开发环境的,但我认为使用Keil MDK开发环境更加方便,可以利用RVMDK强大的外设仿真功能加速STM32的开发。我在以前的Blog文章里介绍过如何在RVMDK中建立STM32 工程,以及如何使用RVMDK的软件仿真功能,下面我将详细说明怎样将已有的IAR工程移植到RVMDK。 不管是IAR还是RVMDK,编程时使用的都是STM32的固件函数库,唯一不同的是启动文件。RVMDK在建立STM32工程时会自动创建启动文件 STM32F10x.s,而IAR使用的启动文件是cortexm3_macro.s。此外,两者对中断向量表的管理也不一样。
[单片机]
<font color='red'>STM32</font> IAR工程->Keil MDK转换详解
STM32通过中断方式实现USART1通信
1.前言 这个例程花了我好几天的时间,涉及到的内容比较多,走了很多弯路,一定要总结一下! 首先说明,我的开发板不是比较流行的正点原子家的,而是普中的STM32F1,原子家的开发板太贵了。到目前为止,我还没有发现我的开发板出现硬件上的问题,就是客服很不给力,关于仿真器配置的一个小问题就解决不了。好在网上资料比较丰富,慢慢也能解决自己遇到的一些问题。 思路和程序网上大家列举的都一样。在上网查资料的过程中发现,ARM开发板就是厉害,我想找什么问题,不管大家用什么型号的开发板,程序几乎一点都没有变化,问题讨论起来方便多了! 2.程序摘要 分为4部分:GPIO配置、USART参数配置、NVIC总中断配置、中断函数; 在主函数中初始
[单片机]
STM32学习笔记之DMA使用
实验:控制串口一以DMA方式发送(TX)数据 一、初始化DMA 对STM32任何模块使用前都要对其初始化、首先就是初始化外设时钟,查看时钟 数可知DMA时钟由AHB得来。 初始化时钟:RCC- AHBENR|=1 0; 在读数据手册可知:直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。 两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。我们实
[单片机]
<font color='red'>STM32</font>学习笔记之DMA使用
stm32_HSI
stm32启动时使用的是外部8M晶振,在system_stm32f10x.c文件中有定义,且使用的函数为void SystemInit (void) 使用外部晶振HSE时的代码如下 void SystemInit (void) { // /* Reset the RCC clock configuration to the default reset state(for debug purpose) */ // /* Set HSION bit */ // RCC- CR |= (uint32_t)0x00000001; // /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO b
[单片机]
STM32 ST-LINK Utility无法下载的处理方法
现象:提示family: Unknown device Read out protection is activated. Could not disable Read Out Protection! 分析:由于STM内部提供了数据保护,有读出保护和写保护。禁止读出保护起作用,那么下载器就读不出内容了。是为了防止盗版的功能。做产品应该使用。 解决办法:只能把写保护、读保护取消,并擦出整个芯片。 首先,连接板子与PC,进入Dos命令行,进入C:\Program Files\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility目录下,执行S
[单片机]
<font color='red'>STM32</font> ST-LINK Utility无法下载的处理方法
STM32 SPI Flash DFU
这次讲的是将程序、图片或其他文件下载到SPI Flash中。我使用的是W25X16的SPI Flash,他共有2MB空间,2个Block,512ge Sector,8096个Page。由于SPI Flash不能直接跑程序,我们从接口就知道了。 接下去我们就来讲讲怎么编写SPI flash的升级功能。这次的工程是基于之前的Internal Flash修改而来的。修改的部分主要在USB_User组里: 我只将改改的部分。 hw_config.c、usb_istr.c、usb_prop.c、usb_pwr.c这介个文件没有什么还修改的。usb_desc.c文件需要修改下接口字符串描述符,由于我们的SPI Flash空间2M,所以我们将
[单片机]
<font color='red'>STM32</font> SPI Flash DFU
stm32 程序二次加载:串口
使用串口二次加载程序即:不需要拆机就能够对产品进行升级,通过Bootloader就可以完成这项工作。该BootLoader的主要功能就是接受串口发送过来的应用程序并存放在固定的内存地址上,程序指针跳转到该地址上,程序就加载成功。 1、STM32在线升级 (IAP) IAP(In-Application Programming) 指MCU可以在系统中获取新代码并对自己重新编程,即可用程序来改变程序。 1.1、IAP编写流程: 由Bootloader负责检测SD卡中是否有固件更新所需的BIN文件,或者通过SPI、CAN、以太网、串口等方式获取BIN文件。 如果获取到所需要的BIN文件,则开始复制文件更新固件,更新结束
[单片机]
STM32操作 I/O 口的步骤
先来总结一下 STM32 操作 I/O 口的步骤(以精英板为例): ① 使能 I/O 口时钟,调用函数为RCC_APB2PeriphClockCmd(); ② 初始化 I/O 参数,调用GPIO_Init(); ③ 操作 I/O 口 看了STM32操作 I/O 口的步骤,是不是一头雾水,因为我们以前学习51单片机的时候,根本没有这么麻烦,I/O 想输入就直接读,想输出就直接赋值,串口、AD转化、外部中断等等也都是想用就用,不需要单独配置时钟。 51单片机的这种做法确实很方便,不需要有乱七八糟的设置就能让芯片跑起来,但是随之带来的就是所谓的功耗问题。换句话来说就是一些资源根本用不上,但是芯片却还给它分配资源,即增加了芯片的负担,
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved