STM32学习手记 -USART中断

发布者:捡漏来了最新更新时间:2012-08-31 来源: 51hei关键字:STM32  习手记  USART中断 手机看文章 扫描二维码
随时随地手机看文章
/************************************
* 文件名: main.c
* 内容简述: 本例程演示如何操作USART的接收程序(中断模式)。
* 用串口调试软件向开发板发送一字节,开发板会将该字节反发回PC
*/
#include "stm32f10x_lib.h"
/***************************************************
* 函数名称    :void RCC_Configuration()
* 功能描述    : 复位和时钟控制 配置
* 参数        :  无
* 返回值      :  无
* 全局变量    :  无
* 全局静态变量:  无
* 局部静态变量:  无
***********************************************************/
void RCC_Configuration()
{
       ErrorStatus HSEStartUpStatus;             //定义外部高速晶振启动状态枚举变量
       RCC_DeInit();                                                                                 //复位RCC外部寄存器到默认值
       RCC_HSEConfig(RCC_HSE_ON);                 //打开外部高速晶振
       HSEStartUpStatus=RCC_WaitForHSEStartUp();      //等待外部高速时钟准备好

       if(HSEStartUpStatus==SUCCESS){         //外部高速时钟已经准备好

              FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法,位置:RCC初始化子函数里面,时钟起振之后
              FLASH_SetLatency(FLASH_Latency_2);        //FLASH时序延迟几个周期,等待总线同步操作。推荐按照单片机系统运行频率,0—24MHz时,取Latency=0;24—48MHz时,取Latency=1;48~72MHz时,取Latency=2。

              RCC_HCLKConfig(RCC_SYSCLK_Div1);       //配置AHB(HCLK)==系统时钟/1
              RCC_PCLK2Config(RCC_HCLK_Div1);      //配置APB2(高速)(PCLK2)==系统时钟/1 
              RCC_PCLK1Config(RCC_HCLK_Div2);     //配置APB1(低速)(PCLK1)==系统时钟/2
              //注:AHB主要负责外部存储器时钟。APB2负责AD,I/O,高级TIM,串口1。APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM。


              RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);   //配置PLL时钟==(外部高速晶体时钟/1)* 9 ==72MHz
              RCC_PLLCmd(ENABLE);                                                                   //使能PLL时钟
              while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);  //等待PLL时钟就绪
              RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  //配置系统时钟==PLL时钟
              while(RCC_GetSYSCLKSource()!=0x08); //等待系统时钟源的启动
       }
                                                                                                                                                                    
       //------------------------以下为开启外设时钟的操作-----------------------//
       //   RCC_AHBPeriphClockCmd (ABP2设备1 | ABP2设备2 , ENABLE); //启动AHB设备
       //   RCC_APB2PeriphClockCmd(ABP2设备1 | ABP2设备2 , ENABLE); //启动ABP2设备
       //   RCC_APB1PeriphClockCmd(ABP2设备1 | ABP2设备2 , ENABLE); //启动ABP1设备

      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1 , ENABLE);   //打开APB2外设
}

/*********************************************
* 函数名称    : NVIC_Configuration(void)
* 功能描述    : NVIC(嵌套中断控制器)配置
* 参数        :  无
* 返回值      :  无
* 全局变量    :  无
* 全局静态变量:  无
* 局部静态变量:  无
***********************************************/
void NVIC_Configuration( )
{
      NVIC_InitTypeDef NVIC_InitStructure;    //定义一个中断结构体

//     NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  //设置中断向量表的起始地址为0x08000000
//     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置NVIC优先级分组,方式。
       //注:一共16个优先级,分为抢占式和响应式。两种优先级所占的数量由此代码确定,NVIC_PriorityGroup_x可以是0、1、2、3、4,
       //分别代表抢占优先级有1、2、4、8、16个和响应优先级有16、8、4、2、1个。规定两种优先级的数量后,所有的中断级别必须在其中选择,
       //抢占级别高的会打断其他中断优先执行,而响应级别高的会在其他中断执行完优先执行。

       NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel; //通道设置为串口1中断
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //中断响应优先级0
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打开中断
       NVIC_Init(&NVIC_InitStructure);   //初始化
}

/****************************************
* 函数名称    :GPIO_Configuration()
* 功能描述    : GPIO配置
* 参数        :  无
* 返回值      :  无
* 全局变量    :  无
* 全局静态变量:  无
* 局部静态变量:  无
****************************************/
void GPIO_Configuration()
{
       GPIO_InitTypeDef GPIO_InitStructure;    //定义GPIO初始化结构体

       //--------将USART1 的TX 配置为复用推挽输出 AF_PP---------------------//
       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;     //管脚位置定义,标号可以是NONE、ALL、0至15。
       GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;  //输出速度2MHz
       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;   //推挽输出模式 Out_PP
       GPIO_Init(GPIOA,&GPIO_InitStructure);     //E组GPIO初始化

       //--------将USART1 的RX 配置为复用浮空输入 IN_FLOATING---------------------//
       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;   //管脚位置定义
       //输入模式下配置输出速度无意义
       //GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;  //输出速度2MHz
       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空输入 IN_FLOATING                    
       GPIO_Init(GPIOA,&GPIO_InitStructure); //C组GPIO初始化

      
}

/****************************************************
* 函数名称    :USART1_Configuration( )
* 功能描述    : 配置USART1数据格式、波特率等参数
* 参数        :  无
* 返回值      :  无
* 全局变量    :  无
* 全局静态变量:  无
* 局部静态变量:  无
*******************************************************/
void USART1_Configuration( )
{
       USART_InitTypeDef USART_InitStructure; //串口设置恢复默认参数

       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;      //打开Rx接收和Tx发送功能
       USART_Init(USART1, &USART_InitStructure);  //初始化
       USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  // 若接收数据寄存器满,则产生中断
       USART_Cmd(USART1, ENABLE);                                                             //启动串口                  
                                                  
       //-----如下语句解决第1个字节无法正确发送出去的问题-----//
       USART_ClearFlag(USART1, USART_FLAG_TC);     // 清标志
}
/********这是中断服务子程序,在stm32f10x_it.c中*************************/
void USART1_IRQHandler(void)
{
       if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)    //若接收数据寄存器满
       {
              USART_SendData(USART1, USART_ReceiveData(USART1));  //回发给PC
              while(USART_GetFlagStatus(USART1, USART_IT_TXE)==RESET);//等待发完
       }
}

/**************************************************
* 函数名称    :main()
* 功能描述    : 主函数
* 参数        :  无
* 返回值      :  无
* 全局变量    :  无
* 全局静态变量:  无
* 局部静态变量:  无
****************************************************/
int main()
{
       RCC_Configuration();
       GPIO_Configuration();
       NVIC_Configuration( );
       USART1_Configuration();

       while(1){
       }    
}
关键字:STM32  习手记  USART中断 引用地址:STM32学习手记 -USART中断

上一篇:STM32学习手记-TIM3上溢出定时
下一篇:STM32学习手记①-GPIO的输入、输出、检测

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

stm32 boot启动经验
STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存 = 芯片内置的Flash。 2)SRAM = 芯片内置的RAM区,就是内存啦。 3)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区 域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执 行程序 不同的下载方式对应STM32启动方式也不同,如下图是STM32三种启动方式: ● 第一种启动方式是最常用的用户FLASH启动,正常工作
[单片机]
<font color='red'>stm32</font> boot启动经验
基于stm32的I2C通讯
IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备,是一种半双工的同步通讯方式,由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、 IC 与 IC 之间进行双向传送, 高速 IIC 总线一般可达 400kbps 以上。 关于半双工同步以及串行的相关解释在之前的博文中有详细的讲解,参考连接 通讯方式简介 I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。 开始信号: SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据。 结束
[单片机]
基于<font color='red'>stm32</font>的I2C通讯
STM32 USB SD卡读卡器和NAND FLASH模拟U盘
本次工程是要同时实现SD卡读卡器和NAND Flash模拟U盘的功能。结合之前的两个工程,稍稍修改下就可以了。 既然要实现两个盘,当然在usb_prop.c中的Max_Lun变量赋值为1,在USB_User组中同时添加fsmc_nand.c和sdio_sdcard.c这两个文件,在外设库中挺尸添加stm32f10x_sdio.c和stm32f10x_fsmc.c两个文件。 添加完之后,可能会有些许的错误,解决完后,我们就要修改下mass_mal.c文件了,这个文件本次要同时实现SD卡和NAND Flash的相关驱动代码的挂接,代码如下: uint32_t Mass_Memory_Size ; uint32_t Mass_Block
[单片机]
<font color='red'>STM32</font> USB SD卡读卡器和NAND FLASH模拟U盘
stm32之低功耗总结
四、写一写到底选择什么模式: 再看完几篇大神的文章之后,我觉得应该重新规划一下文章的描述方式,我们首先就要明白自己的目的是什么,然后看看自己的目的的最好结果和最差结果,然后分析自己目前的处境。最后才是选择方法途径,也许再明白自己和目标的局限性之后,才能更好的实现目标吧。 找到目标--------------》认清现状--------------》找方法 4.1、低功耗的目的和应用: 我们做低功耗目的可以说是相当简单,那就是省电,省下电量。 但是,省电只是一个特性,我们不能用这个特性来影响了主要的功能,所以stm提供了多种的省电方式。 我们先按照常见的产品来分低功耗的类型: 最不需要省电的:例如很多常备设备,比如那些要保
[单片机]
<font color='red'>stm32</font>之低功耗总结
STM32学习之路-用STM32库函数配置RCCc
利用STM32提供的RCC函数配置RCC 定义错误状态变量 ErrorStatus HSEStartUp; 初始化RCC状态寄存器 RCC_DeInit(); 使能高速外部晶振HSE RCC_HSEConfig(RCC_HSE_ON); 参数有3个: RCC_HSE_OFF: HSE oscillator OFF RCC_HSE_ON: HSE oscillator ON RCC_HSE_Bypass: HSE oscillator bypassed with external clock 等待高速外部晶振工作 HSEStartUp = RCC_WaitForHSEStartUp()
[单片机]
STM32芯片异常复位的原因有哪些
问题描述 某STM32用户反馈,当使用STM32L4芯片的时候,程序运行一段时间后,会忽然复位。复位后程序继续运行,但是还会继续复位,原因不详。 问题解析 初步确定复位的原因,是硬件复位,如外部NRST被拉低,还是软件复位,包括软件直接调用复位,或者看门狗复位,还是低功耗模式如standby模式被唤醒时产生中断。 查看复位状态寄存器了解复位大方向,然后做进一步得拆解分析。 目前客户项目的复位原因是因为看门狗复位,即客户使用了IWDG,但由于某种原因没有及时喂狗,导致IWDG超时复位。初步怀疑由于客户软件的问题,程序跑飞,进入异常处理。 因为客户的异常处理函数中并没有做任何动作,导致独立看门狗IWDG复位。基于此,我
[单片机]
<font color='red'>STM32</font>芯片异常复位的原因有哪些
一种无OS的STM32实用软件框架
介绍 一种无OS的STM32实用软件框架,包括任务轮询管理,命令管理器、低功耗管理、环形缓冲区等实用模块。系统中广泛利用自定义段技术减少各个模块间的耦合关系,大大提供程序的可维护性。 主要功能 支持模块自动化管理,并提供不同优先等级初始化声明接口。 支持任务轮询管理,通过简单的宏声明即可实现,不需要复杂的声明调用。 支持低功耗管理,休眠与唤醒通知。 支持命令行解析,命令注册与执行。 blink设备支持,统一管理LED、震动马达、蜂鸣器 使用说明 点击STM32嵌入式开发公众号文末的“阅读原文”,可以完整的工程代码,系统开发平台如下: MCU:STM32F401RET6 IDE:IAR 7.4或者K
[单片机]
STM32 V3.4库函数使用建立工程方法
清晰地记得刚从51单片机过度到STM32,那种一头雾水的感觉。使用的STM32开发板是非常不适合初学者使用的开发板,它是硬件看上去华丽的神舟开发板。在这里我不评论神舟开发板如何如何,如果你是初学者,建议你不要使用神舟开发板。 拿到神舟开发板的教程,坑爹啊,如何使用STM32库的说明都没有,这对初学者也太不公平了吧。鄙人一个STM32菜鸟在网上花了半天时间才弄明白如何使用这个库,如何建立工程。今天分享我当初是如何使用STM32库文件建立工程的,非常适合初学者。 少废话,上图:
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

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