一,硬件准备:
STM32F103ZET6微雪开发板
RS232接口模块
USB-RS232转接线
接线:
RS232接口模块芯片为MAX3232,模块连接开发板的USART1口,引脚接线:
开发板 <----> RS232转TTL模块 3.3V ---------- VCC GND---------- GND RX ------------ RXD TX ------------ TXDRS232接口模块与电脑之间用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.sb)在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\
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