STM32学习之串口

发布者:风暴使者最新更新时间:2016-10-10 来源: eefocus关键字:STM32  串口 手机看文章 扫描二维码
随时随地手机看文章
第一步:把串口用的引脚设置。接收的为GPIO_Mode_IN_FLOATING;   //浮空输入
发送的为GPIO_Mode_AF_PP;  // 复用推挽输出
 
第二部设置 void NVIC_Configuration(void)
 
NVIC_InitTypeDef NVIC_InitStructure;
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel ; // 全局中断、、 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级1 
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //允许中断
  NVIC_Init(&NVIC_InitStructure);
 
 
第三部设置 UART  的时钟,波特率,模式等等
void USART1_Configuration(void)
 { 
USART_InitTypeDef USART_InitStructure; 
USART_ClockInitTypeDef USART_ClockInitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );
  USART_ClockInitStructure.USART_Clock = USART_Clock_Disable; // 时钟低电平活动 
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; // 时钟低电平 
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; // 时钟第二个边沿进行数据捕获 USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; // 最后一位数据的时钟脉冲不从SCLK输出 
USART_ClockInit(USART1, &USART_ClockInitStructure); // 时钟参数初始化设置
  USART_InitStructure.USART_BaudRate = 115200; // 波特率为:115200 
USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8位数据 
USART_InitStructure.USART_StopBits = USART_StopBits_1; // 在帧结尾传输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_ClearFlag(USART1, USART_IT_RXNE); //清中断,以免一启用中断后立即产生中断
 USART_ClearFlag(USART1, USART_IT_TXE);
 USART_ITConfig(USART1,USART_IT_RXNE, ENABLE); //使能USART1接收中断源 
//USART_ITConfig(USART1,USART_IT_TXE, ENABLE); //使能USART1发送中断?????????????
//这一句一加上就是一直发送,???????
  USART_Cmd(USART1, ENABLE); //USART1总开关:开启 
 }
 
第四部:串口服务函数
void USART1_IRQHandler(void)
{
 
/* if (USART_GetITStatus(USART1, USART_IT_TXE) != RESET )     //发送
{
USART_ClearFlag(USART1, USART_FLAG_TXE);
USART_ClearITPendingBit(USART1, USART_FLAG_TXE);
 
 
USART_SendData(USART1, 0x02);
}
*/
/* if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)     //接收
{
USART_ClearFlag(USART1, USART_FLAG_RXNE);
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //这两条什么区别
 
USART_SendData(USART1, 0x00);
// while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) ; 
}
 */
        if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET)
       {
              //将数据回送至超级终端
              USART_SendData(USART1, USART_ReceiveData(USART1));
              //等待数据发送完毕
              while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
       }
}
 
第五步:发送函数
    for( i=0;TxBuf1[i]!='\0';i++)
       {
              USART_SendData(USART1,TxBuf1[i]);
              GPIO_SetBits(GPIOB,GPIO_Pin_5);
              //等待数据发送完毕
              while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
              GPIO_ResetBits(GPIOB,GPIO_Pin_5);
       }

关键字:STM32  串口 引用地址:STM32学习之串口

上一篇:STM32几种启动文件理解
下一篇:关于STM32的ADC/DAC问题集锦

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

STM32学习总结之Sysstick(系统滴答定时器)
学习内容: 1、Cortex-M3 在内核部分 包含了一个简单的定时器——SysTick timer STM32内核有一个定时器。 2、有定时器就需要有时钟源,时钟源可以是内部的还可以是外部的,需要阅读使用手册确定什么作为时钟源。 在STM32 中SysTick 以 HCLK(AHB 时钟)或HCLK/8 作为运行时钟 3、SysTick 是一个24 位的定时器,即一次最多可以计数2^24 个时钟脉冲,这 个脉冲计数值被保存到 当前计数值寄存器STK_VAL(SysTick current value register) 中,只能向下计数,每接收到一个时钟脉冲STK_VAL 的值就向下减1,直至0,当STK_VAL 的值被
[单片机]
<font color='red'>STM32</font>学习总结之Sysstick(系统滴答定时器)
其实,STM32有隐藏的定时器~
DWT 在Cortex-M里面有一个外设叫DWT(DataWatchpoint andTrace),是用于系统调试及跟踪,DWT的中文名字应该是:数据观察点触发。在STM32用户手册的第32章节Debugsupport (DBG)有如下框图。 明显DWT属于DBG部分的功能,从上图的标题可以看出DWT属于CortexM3内核的,理论上M3内核的MCU都支持的,这个下文会说明。在这里我将其称之为“隐藏的定时器”,因为他可以代替定时器外设实现上文提到延时功能和测量代码运行时间的功能,DWT不能代替定时器的其他功能。 之所以DWT可以实现延时功能,因为它有一个32的计数器CYCCNT,这是一个向上计数的计数器,当它溢出时会自动清零并
[单片机]
STM32开发板的TIM3开启和关闭
关闭定时器中断要考虑好多情况 1)关闭定时器时,定时器是否在处在工作状态 2)关闭定时器时,定时器是否正好进入中断,造成关闭程序出现断层,进而无法实现完整关闭程序,此时可以使用高一级别的外部中断强制进入外部中断服务函数进行关闭程序 3)关闭定时器时,关闭定时器的程序是否在定时器服务函数里面?还是在总函数里面?还是在外部中断服务函数里面?是需要考量的? 4)关闭定时器时,定时器的中断触发时间是否太紧凑?定时器的中断总次数是否太小?都会影响关闭定时器程序运行的连续性。 以下为关闭程序: 首先打开时钟,然后才能进行关闭操作。 RCC- APB1ENR|=1 1; //TIM3时钟使能 TIM3- ARR=arr; //设定计数器自
[单片机]
判断STM32 GPIO输入口的输入状态(高电平或低电平)
以PE2和PE4为例: ① 判断单个端口是否为高电平: if(GPIOE- IDR& GPIO_IDR_IDR2) { 函数体; } 当PE2端口为高电平时,if条件为真;当PE2口为低电平时,if条件为假; ② 判断单个端口是否为低电平: if((~GPIOE- IDR)& GPIO_IDR_IDR2) { 函数体; } 分析:首先通过 &GPIO_IDR_IDR屏蔽掉PE2之外的其他PE口。当PE2为高电平时,GPIO-〉IDR的bit2为‘1’,取反后为‘0’,因此条件为假;当PE2为低电平时,GPIO-〉IDR的bit2为‘0’,取反后为‘1’,因此条件为真;通过此方法
[单片机]
STM32 UART串口驱动程序
示例1.通过UART1进行数据发送 UART 1 的初始化 /** * @brief UART1 Initialise. * @param None. * @retval None. */ void UART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //UART1 选择对应UART的RCC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GP
[单片机]
如何配置stm32中断的优先级
写作原由:因为之前有对stm32 优先级做过研究,但是没时间把整理的东西发表,最近项目需要2个串口,但是不是两个串口同时使用,只是随机使用其中一个,程序对2个串口的优先级需要配置; 此文思路:“中断优先级”思维导图--》关键要点---》结合图和要点相关程序应用例程讲解; 我们先来看ST公司的一张图: 我自己依据此图理解,应用思维导图画了一张方便理解:(如果看不清可通过ctrl+鼠标滑轮 放大看;) 前提条件1:组别优先顺序(第0组优先级最强,第4组优先级最弱):NVIC_PriorityGroup_0》NVIC_PriorityGroup_1》NVIC_PriorityGroup_2》NVIC_PriorityGrou
[单片机]
如何配置<font color='red'>stm32</font>中断的优先级
STM32单片机中使用SPI通信的方法
  在本教程中,我们将使用 STM32F103C8 的 Blue Pill 板替换一个 Arduino 板,并将使用 SPI 总线与 Arduino 板进行通信。在这个STM32 SPI 示例中,我们将使用Arduino UNO作为 Slave,STM32F103C8 作为 Master,两个16X2 LCD 显示器分别连接在一起。两个电位器还与STM32(PA0)和Arduino(A0)相连,通过改变电位器来确定主机到从机和从机到主机的发送值(0到255)。   STM32F103C8中的SPI   比较 Arduino 和 STM32F103C8 Blue Pill 板中的 SPI 总线,STM32 有2 条 SPI 总线
[单片机]
在<font color='red'>STM32</font>单片机中使用SPI通信的方法
如何利用定时器产生PWM波
摘要:利用定时器产生PWM波。然后利用32的外部中断和定时器来测量32输出的波形硬件:STM32F103C8T6核心板、示波器、串口调试助手所用到的的引脚为PA8和PA0。 测量方案:在第一次外部中断(上升沿触发)到之时,开启定时器,同时计数器清零。然后等待第二次中断到来,在第二次外部中断(上升沿触发)到之时,获取计数器的计数值,同时关闭计数器。因为知道了计数器计数一个数的时间,所以在第二次外部中断(上升沿触发)到之时,获取计数器的计数值,通过这个值就知道一个脉冲的时间周期。时间周期的倒数就是外部信号的频率。 一、利用TIM1的CH1产生PWM波 pwm.c #include pwm.h voidTIM1_PWM_Init
[单片机]
如何利用定时器产生PWM波
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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