首页 > 其他分享 >STM32F103入门练习:IAR开发环境设置及USART1中断方式收发字符

STM32F103入门练习:IAR开发环境设置及USART1中断方式收发字符

时间:2023-02-21 00:22:46浏览次数:41  
标签:STM32F103 USART NVIC InitStructure 串口 GPIO USART1 IAR

一,硬件准备:

STM32F103ZET6微雪开发板

RS232接口模块

USB-RS232转接线

接线:

RS232接口模块芯片为MAX3232,模块连接开发板的USART1口,引脚接线:

开发板 <----> RS232转TTL模块 3.3V ---------- VCC GND---------- GND RX ------------ RXD TX ------------ TXD

 RS232接口模块与电脑之间用USB-RS232转接线直连。

二,软件开发工具

本例开发环境是 IAR Embedded Workbench For ARM 7.2,

库文件3.5.0版:STM32F10x_StdPeriph_Lib_V3.5.0,

下载调试工具用 JTAG。

三,IAR开发环境设置:

1,建立项目文件夹

为使项目文件简洁,本例项目使用的通用固件库文件都放在模板文件夹里,不复制到项目文件夹里,在IAR里设置固件库文件路径,所以项目文件夹下面的CMSIS和FWLIB文件夹基本是空的。

建立如下文件夹结构,把库文件复制到相关位置:

 

2,IAR开发环境设置

2-1,新建项目

打开 IAR v7.2,建立工程区:File -> New -> Workspace

新建工程:Project - Creat New Project

Tool chain:选 ARM,Empty Project -> OK,在文件夹选择窗口选所建项目文件夹,输入项目名称:ex1_usart -> OK 此时可以保存项目:File -> Save All,输入名称:ex1_usart -> OK,保存为 .eww 文件 2-2,在项目栏添加管理文件夹和文件 右键工程名 (ex1_usart) -> Add -> Add Group,输入名称:SMSIS -> OK,建立了一个CMSIS文件夹,同样,建立如下管理文件夹结构, 同样操作,建立如下管理文件夹结构: ex1_usart |----- SMSIS |           |----- Startup |----- FWLIB |----- USER   在管理文件夹添加文件,右键文件夹 -> Add -> Add Files  本例作为练习,只添加必要的程序文件。 a)在CMSIS - startup 添加 startup_stm32f10x_hd.s 本例用 STM32F103ZET6,属大容量芯片,参照下表选择相应启动文件为 startup_stm32f10x_hd.s  

b)在CMSIS 添加 system_stm32f10x.c

c)在 FWLIB 分别添加:

misc.c,中断设置相关

stm32f10x_gpio.c,GPIO设置相关

stm32f10x_rcc.c,RCC时钟设置相关

stm32f10x_usart.c,串口设置相关

d)在 USER 添加主程序和中断服务程序:

主程序和中断服务程序 stm32f10x_it.c 和 stm32f10x_it.h 需提前复制和创建,然后添加:

main.c 主程序

stm32f10x_it.c 中断服务程序

 2-3,项目设置

a)选择芯片

右键项目 ->Option ->General Options ->Target:点选 Device ->点右边图标,选择芯片(Device)为:ST STM32F103x8

b)Library Configuration:打勾 Use CMSIS

c)编译设置

选 C/C++ Compiler ->Preprocessor,如下图:

 

在 Defined Symbol 输入:

STM32F10X_HD,启动文件,只添加1个。

USE_STDPERIPH_DRIVER,使用标准固件库 在 Additional include directories: 框里输入查找路径,......代表库模板文件夹的具体路径:

$PROJ_DIR$\
$PROJ_DIR$\CMSIS\
$PROJ_DIR$\FWLIB\inc\
$PROJ_DIR$\USER\
......\STM32F10X_Template\
......\STM32F10X_Template\CMSIS\
......\STM32F10X_Template\FWLIB\inc\
......\STM32F10X_Template\USER\

d)JTAG下载调试设置 Options ->Debugger -Setup:Driver 选 J-Link/J-Trace,勾选 Run to main J-Link/J-Trace ->Connection:勾选 USB Device 0,勾选 SWD ->OK    四,编写程序 1、main.c 主程序
  1 /*
  2 ******************************************************************************
  3 * @file main.c
  4 * 串口USART1 以9600波特率 从RXD引脚接收数据,加1再通过TXD引脚发送出去
  5 * 芯片:STM32F103ZET6,中断方式实现
  6 * TXD:PA9,RXD:PA10
  7 ******************************************************************************
  8 */
  9 
 10 /* Includes ------------------------------------------------------------------*/
 11 #include "stm32f10x.h"
 12 #include <stdbool.h> // 针对 bool 类型
 13 
 14 bool Read_Flag = 0; // 接收中断标志位
 15 u8 ReceiveData = 0; // 接收完毕中断标志位
 16 
 17 /* USART1 默认占用 PA9 和 PA10 两个GPIO,配置前先使能GPIOA 的时钟,
 18 然后 PA9 配置成复用推挽输出,PA10 配置成浮空输入
 19 */
 20 
 21 // a, 串口引脚配置
 22 void UART_GPIO_Configuration(void)
 23 {
 24 GPIO_InitTypeDef GPIO_InitStructure;
 25 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA 的时钟
 26 //配置USART1时钟要放在GPIO初始化之前,否则会USART会自动发送字符FE
 27 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
 28 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
 29 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 30 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
 31 GPIO_Init(GPIOA, &GPIO_InitStructure);
 32 
 33 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
 34 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
 35 GPIO_Init(GPIOA, &GPIO_InitStructure);
 36 }
 37 
 38 // b, 串口配置
 39 /* 在配置 USART1 前先使能 USART1 时钟,当执行了 USART_Init 后,配置参数生效,
 40 然后允许 USART1接收中断,最后打开USART1
 41 */
 42 void UART_Init(void)
 43 {
 44 USART_InitTypeDef USART_InitStructure;
 45 //下面这句放到上面UART_GPIO_Configuration( )函数,否则发送首字符是FE
 46 //RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
 47 USART_InitStructure.USART_BaudRate = 9600;
 48 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8位长度
 49 USART_InitStructure.USART_StopBits = USART_StopBits_1;
 50 USART_InitStructure.USART_Parity = USART_Parity_No; // 无校验位
 51 
 52 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无效 硬件流控制
 53 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 收发模式
 54 
 55 USART_Init(USART1, &USART_InitStructure); // 初始化 USART1
 56 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 允许 USART1 接收中断
 57 USART_Cmd(USART1, ENABLE); // 打开 USART1
 58 }
 59 
 60 // c, 中断配置
 61 /* 串口使用中断方式接收数据,需要对 NVIC(嵌套向量中断控制器,Nested Vectored Interrupt Controller)
 62 进行设置,把USART1接收中断的优先级配置成 先占优先级的第0组,副优先级也设置为0,
 63 即优先级最高,并使能 USART1 的中断通道
 64 */
 65 void NVIC_UART_Configuration(void)
 66 {
 67 NVIC_InitTypeDef NVIC_InitStructure;
 68 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // 先占优先级为0
 69 //配置串口中断通道,等号右边在老版本的库文件里写成 USART1_IRQChannel
 70 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
 71 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 副优先级为0
 72 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能串口中断
 73 NVIC_Init(&NVIC_InitStructure); // 初始化 NVIC
 74 }
 75 
 76 // d, 串口中断服务程序,添加在 stm32f10x_it.c 中
 77 
 78 // e, 发送函数
 79 void UART_Send_Byte(u8 Digital)
 80 {
 81 USART_SendData(USART1, Digital); // 发送 1 Byte 数据
 82 // 等待发送完成
 83 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET );
 84 USART_ClearFlag(USART1, USART_FLAG_TXE); // 清除 发送寄存器空 标志位
 85 }
 86 // f, 主函数
 87 int main(void)
 88 {
 89 UART_GPIO_Configuration( ); // 串口引脚配置
 90 UART_Init( ); // 串口配置
 91 NVIC_UART_Configuration( ); // 串口中断配置
 92 
 93 while(1)
 94 {
 95 //如果取数标志已置位,就将读到的数从串口发出去
 96 if(Read_Flag)
 97 {
 98 Read_Flag = 0; // 接收完毕标志位清零
 99 UART_Send_Byte(ReceiveData); // 发送接收到的数据
100 }
101 }
102 }

2,中断服务程序 stm32f10x_it.c:

 1 extern u8 ReceiveData;
 2 extern bool Read_Flag;
 3 
 4 //......
 5 
 6 void USART1_IRQHandler(void)
 7 {
 8 
 9 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
10 {
11 // 转存数据,ReceiveData 在主程序里定义
12 ReceiveData = USART_ReceiveData(USART1) + 1;
13 USART_ClearFlag(USART1, USART_FLAG_RXNE); // 清接收中断标志位
14 Read_Flag = 1; // 设置接收完毕标志位,ReadFlag 在主程序里定义为 bool
15 }
16 }

五,测试

连接开发板和电脑,使用串口调试助手测试如下:

 

标签:STM32F103,USART,NVIC,InitStructure,串口,GPIO,USART1,IAR
From: https://www.cnblogs.com/maxhill/p/17137471.html

相关文章