STM32F4之USART【库函数操作】

STM32F407xx内嵌四个通用同步/异步接收器??(USART1,USART2,USART3 和USART6)和两个通用异步收发器(UART4和UART5)。这6个接口提供异步通信的IrDASIR ENDEC支持,多机通信模式,单线半双工通信模式LIN主/从功能。 USART1和USART6接口能够速度高达10.5 Mbit / s的通信其他可用的接口通信高达5.25bit/s。USART1,USART2,USART3和USART6还提供硬件管理的CTS,RTS信号,智能卡的模式(ISO7816兼容)和类似的SPI通信能力。所有接口都可以通过DMA控制器。
         这里只使用了两根线的最简单串口设置。
         硬件环境:STM32F4-Discovery
         软件环境:MDK4.7a
         实现的功能:1、串口初始化,
                              2、通过串口发送数据
                              3、中断方式接收数据,并将接收到的数据回送。
        使用库函数操作
        首先,配置NVIC使用NVIC_PriorityGroupConfig()设置优先级分组,使用NVIC_Init()对NVIC进行初始化

  1. void NVIC_Config()
  2. {
  3. NVIC_InitTypeDef NVIC_InitStructure;
  4. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  5. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
  6. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
  7. NVIC_InitStructure.NVIC_IRQChannel  = USART1_IRQn;
  8. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  9. NVIC_Init(&NVIC_InitStructure);
  10. }

第二步:配置引脚功能,因为我的板子上PA9被用来驱动LED了,所以只能将将串口映射到PB6,PB7。这个设置跟F1系列的有点差别。首先初始化端口时钟,第二配置端口引脚功能,第三不设置功能映射将串口连接到引脚。

  1. void USART_Gpio_Config(void)
  2. {
  3. GPIO_InitTypeDef GPIO_InitStructure;
  4. RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB  , ENABLE);
  5. //PB6->TX  PB7->Rx
  6. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  7. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  8. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  9. GPIO_Init(GPIOB, &GPIO_InitStructure);
  10. GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_USART1);
  11. GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_USART1);
  12. }

第三步:配置串口工作方式。步骤也差不多:打开时钟,用Init函数初始化串口,设置串口的接收中断,最后别忘了使能串口。

  1. void USART_Config(void)
  2. {
  3. USART_Gpio_Config();
  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  5. USART_InitStructure.USART_BaudRate = 115200;
  6. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  7. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  8. USART_InitStructure.USART_Parity = USART_Parity_No;
  9. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  10. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  11. USART_Init(USART1,&USART_InitStructure);
  12. USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  13. USART_Cmd(USART1,ENABLE);
  14. }

第四步:添加串口中断函数,函数名是固定的:void USART1_IRQHandler(void)。中断进入时候,先判断接收寄存器是否有数据,有数据时候就接收,然后使用USART_SendData()将数据发回

  1. void USART1_IRQHandler(void)
  2. {
  3. char c;
  4. if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)
  5. {
  6. c = USART_ReceiveData(USART1);
  7. USART_SendData(USART1,c);
  8. }
  9. //while(1);
  10. }

最后就是main了,没啥可说的

  1. int main(void)
  2. {
  3. NVIC_Config();
  4. USART_Config();
  5. while(1)
  6. {
  7. while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));
  8. USART_SendData(USART1,‘b‘);
  9. while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));
  10. USART_SendData(USART1,‘a‘);
  11. delay_ms(1000);
  12. }
  13. }
时间: 2024-10-08 01:02:28

STM32F4之USART【库函数操作】的相关文章

C语言库函数--操作文件

//C库函数读取文件的代码 I/O缓冲机制 C语言库函数写文件都是写在内存中,然后一次写入磁盘.提高了效率. 读写文件,不对系统进行操作,一般采用C语言库函数.移植可以在任何可以对C支持的操作系统,而不用修改. FILE *fopen(const char *path, const char *mode); mode 参数: r    Open text file for reading. The stream is positioned at the beginning of the file

STM32F4 阿波罗 库函数与C语言知识

先聊一聊: 之前使用32都是用的库函数,但是没有理解为什么那么操作,有很多的文件我也不知道要看哪一个,感觉云里雾里,没有学清楚一件东西的感觉不太好,于是就在前几天一直跟着比较详细的视频学习.开始老师讲的方式是使用寻址以及寄存器的方式,我觉得这种比使用库函数要好理解,但是在几个视频之后会发现,开始讲解库了?嗯哼~我是拒绝的呀,带着十分抗拒的心情继续学习,这一次又有了一些不一样的理解. 为什么使用库呢?因为很多的函数都已经被32制造者写好了,就相当于我们喝红豆薏米粉吧(最近在喝,所以举个例子哈),没

stm32 DMA数据搬运 [操作寄存器+库函数](转)

源:stm32 DMA数据搬运 [操作寄存器+库函数] DMA(Direct Memory Access)常译为“存储器直接存取”.早在Intel的8086平台上就有了DMA应用了. 一个完整的微控制器通常由CPU.存储器和外设等组件构成.这些组件一般在结构和功能上都是独立的,而各个组件的协调和交互就由CPU完成.如此一来,CPU作为整个芯片的核心,其处理的工作量是很大的.如果CPU先从A外设拿到一个数据送给B外设使用,同时C外设又需要D外设提供一个数据...这样的数据搬运工作将使CPU的负荷显

STM32 下的库函数和寄存器操作比较

以 led闪烁中的flashLed函数例子: 库函数操作简单,但是效率不如寄存器操作的高: 寄存器操作很复杂,因为要熟悉上百个寄存器,但是程序效率很高 /**下面是通过直接操作库函数的方式实现IO控制**/ while(1) { GPIO_ResetBits(GPIOB,GPIO_Pin_9); //LED0对应引脚GPIOF.9拉低,亮 等同LED0=0; GPIO_SetBits(GPIOB,GPIO_Pin_10); //LED1对应引脚GPIOF.10拉高,灭 等同LED1=1; del

STM32学习笔记——USART串口(向原子哥和火哥学习)

一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换.USART利用分数波特率发生器提供宽范围的波特率选择. STM32 的串口资源相当丰富的,功能也相当强劲.STM32F103ZET6 最多可提供 5 路串口,有分数波特率发生器,支持同步单向通信和半双工单线通信,支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作.它还允许多处理器通信.

STM32通过调用库函数进行编程

1.调用库函数编程和直接配置寄存器编程的区别: 2.CMSIS标准: 3.STM32库函数的组织: 4.程序例举: 调用库函数实现通过USART发送数据(26个大写的英文字母) 首先:在主函数部分先要(调用自己编写的函数)对USART要用到的I/O端口进行配置.打开系统时钟配置和对USART1进行参数配置 下图是通过调用库函数对USART1的参数进行配置,将其配置成异步收发模式.波特率用户可以自定的串口: /********************************************

USART异步模式配置

特性: (1)USART只能一位一位地发送和接受数据,在起始位期间,TX端处于低电平:当闲置时,TX端为高. (2)发送和接受由一共用的波特率发生器驱动,当发送器和接收器的使能位分别置位时,分别为其产生时钟. (3)发送器根据M位的状态发送8位或9位的数据字.当发送使能位TE被置位时,发送移位寄存器中的数据从TX上输出,如果需要用到时钟,相应的时钟脉冲将在SCLK脚上输出. (4)一帧数据结构: ■起始位 ■8位或9位的数据字 ■可选的奇偶校验位 ■停止位 对于上面这张图,从下至上,我们看到串口

08_stm32位带操作

一:位带操作介绍 1.   位带操作 在学习 51 单片机的时候就使用过位操作, 通过关键字 sbit 对单片机 IO 口进行位定义. 但是 STM32 没有这样的关键字, 而是通过访问位带别名区来实现.即将每个比特位膨胀成一个 32 位字, 当访问这些字的时候就达到了访问比特的目的. 比方说 BSRR 寄存器有 32 个位, 那么可以映射到 32 个地址上, 当我们去访问这 32 个地址就达到访问 32 个比特的目的. STM32F1 中有两个区域支持位带操作, 一个是 SRAM 区的最低 1

ADC

  stm32f207,  引脚对应的模拟通道: PA0 IN0, PA1 PA2 PA3 PA4 PA5 PA6 PA7 IN PB0 IN8 PB1 IN9 PC0 IN10 PC1 PC2 PC3  PC4 IN14 PC5 IN15  ADC采样转换时间 ADC转换就是输入模拟的信号量,单片机转换成数字量.读取数字量必须等转换完成后,完成一个通道的读取叫做采样周期.采样周期一般来说=转换时间+读取时间.而转换时间=采样时间+12.5个时钟周期.采样时间是你通过寄存器告诉stm32采样模拟