文章目录

  • 一、实验原理
    • 1.串口协议
      • 1.RS-232
      • 2.RS232标准
      • 3.RS232、485电平与TTL电平的区别
    • 3.USARTG工作原理
  • 二、stm32
    • 2.用寄存器方式实现流水灯
      • 1.GPIO端口初始化
        • (1).时钟配置
        • (2).输入和输出模式和输出速率设置
      • 2.C语言代码实现
        • (1).流水灯实现
        • (2).C语言实现
    • 3.stm32cubeMX使用HAL库点亮LED流水灯
      • 1.实验工具
      • 2.STM32CubeMX生成代码使用HAL库点亮流水灯
        • (1).安装STM32CubeMX
        • (2).安装HAL库
        • (3).新建项目
        • (4).keil仿真模式
  • 三.串口通信下连续输出HELLO WINDOWS
    • 1.代码编写
    • 2.KEIL5项目运行
  • 四.实验内容
    • 1.串口通讯方式
    • 2.LED流水灯实验
  • 五.参考文献

一、实验原理

1.串口协议

1.RS-232

RS-232和485标准

1.串口通讯:串口通讯 (Serial Communication)是一种设备间非常常用的串行通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 通讯协议,我们以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。
2.RS-232:RS-232是现在主流的串行通信接口之一。由于RS232接口标准出现较早,难免有不足之处,主要有以下四点:
(1)接口的信号电平值较高,易损坏接口电路的芯片。RS232接口任何一条信号线的电压均为负逻辑关系。即:逻辑“1”为-3— -15V;逻辑“0”:+3— +15V ,噪声容限为2V。即要求接收器能识别高于+3V的信号作为逻辑“0”,低于-3V的信号作为逻辑“1”,TTL电平为5V为逻辑正,0为逻辑负 。与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接。
(2)传输速率较低,在异步传输时,比特率为20Kbps;因此在51CPLD开发板中,综合程序波特率只能采用19200,也是这个原因。
(3)接口使用一根信号线和一根信号返回线与地线构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。
(4)传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在15米左右。
TTL: TTL电平信号被利用的最多是因为通常数据表示采用二进制规定,+5V等价于逻辑“1”,0V等价于逻辑“0”, 这被称做TTL(晶体管-晶体管逻辑电平Transistor-Transistor Logic)信号系统,这是计算机处理器控制的设备内部各部分之间通信的标准技术。

2.RS232标准

3.RS232、485电平与TTL电平的区别

RS232、RS485、TTL是指电平标准(电信号)
TTL与RS232为全双工通讯,RS485为半双工通讯\n 电平标准不同
TTL电平标准是低电平为0,高电平为1(对地,标准数字电路逻辑)。
RS232电平标准是正电平为0,负电平为1(对地,正负6-15V皆可,甚至可以用高阻态)。
RS485与RS232类似,都是负逻辑,但是采用差分信号逻辑
传输方式不同
RS-232采取不平衡传输方式,即所谓单端通讯
RS485则采用平衡传输,即差分传输方式(使用两根线的电压差表示数据)\n 传输距离不同。
RS-232适合本地设备之间的通信,传输距离一般不超过20m。
RS-485的传输距离为几十米到上千米
传输速度不同。
RS232传输速率较低,最高波特率为19200bps。
RS485的数据最高传输速率为10Mbps。
实用性不同
RS-232 接口电路只允许一对一通信,信号电平较高,容易损坏接口电路的芯片;与TTL电路的电平也不兼容,影响其通用性;使用三线。
RS-485 接口接口电平低,不易损坏器件,且该平与 TTL 电平兼容,可方便与TTL 电平兼容;RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干能力增强,即抗噪声干扰性好;RS-485 接口在总线上是允许连接多达128个收发器。使用两线。

3.USARTG工作原理

USART(Universal Synchronous/Asynchronous Receiver/Transmitter),即通用同步/异步串行接收/发送器。\n\n所谓同步通信和异步通信的主要区别是前者有公共时钟,总线上的所有设备按统一的时序、统一的传输周期进行信息传输。后者没有公共时钟,没有固定的传输周期,采用应答方式通信。简单的说,“同步”就是发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。 “异步”就是发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。异步通信发送方式下,在每一个字符的开始和结束分别加上开始位和停止位,以便使接收端能够正确地将每一个字符接收来。\n\n我们用的最多的UART(Universal Asynchronous Receiver/Transmitter)就是异步通信方式,也就是说,虽然STM32支持USART,但是就一般使用而言,很少使用同步模式,多是使用异步模式。
通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个\nUART(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。\n串行通信一般是以帧格式传输数据,即是一帧一帧的传输,每帧包含有起始信号、数\n据信息、停止信息,可能还有校验信息。USART 就是对这些传输参数有具体规定,当然也\n不是只有唯一一个参数值,很多参数值都可以自定义设置,只是增强它的兼容性。

USB转串口即实现计算机USB接口到物理串口之间的转换。可以为没有串口的计算机或其他USB主机增加串口,使用USB转串口设备等于将传统的串口设备变成了即插即用的USB设备。\n\nUSB主机检测到USB转串口设备插入后,首先会对设备复位,然后开始USB枚举过程。USB枚举时过程会获取设备描述符、配置描述符、接口描述符等。描述符中会包含USB设备的厂商ID,设备ID和Class类别等信息。操作系统会根据该信息为设备匹配相应的USB设备驱动。\n\nUSB虚拟串口的实现在系统上依赖于USB转串口驱动,一般由厂家直接提供,也可以使用操作系统自带的CDC类串口驱动等。驱动主要分为2个功能,其一注册USB设备驱动,完成对USB设备的控制与数据通讯,其二注册串口驱动,为串口应用层提供相应的实现方法。

二、stm32

2.用寄存器方式实现流水灯

1.GPIO端口初始化

(1).时钟配置

本次实验采用GPIOA、B、C三个端口。该三个端口属于APB2总线
1.找到时钟使能寄存器映射及基地址

2.找到端口偏移地址以及对应端口所在位置

3.使能对应端口时钟

//APB2使能时钟寄存器
#define RCC_APB2ENR*((unsigned volatile int*)0x40021018)
RCC_APB2ENR|=1<<2|1<<3|1<<4;
//APB2-GPIOA、GPIOB、GPIOC外设时钟使能

(2).输入和输出模式和输出速率设置

本次实验采用通用推挽输出模式,最高输出时钟频率2Mhz。分别用到A4、B5、C14三个引脚。其中A4、B5属于端口配置低寄存器偏移地址为0x00,C13属于端口配置高寄存器偏移地址为0x04。

1.找到GPIOx端口基地址

2.配置对应引脚寄存器,基地址+偏移量

//----------------GPIOA配置寄存器 -----------------------
#define GPIOA_CRL       *((unsigned volatile int*)0x40010800)
//----------------GPIOB配置寄存器 -----------------------
#define GPIOB_CRL       *((unsigned volatile int*)0x40010C00)
//----------------GPIOC配置寄存器 -----------------------
#define GPIOC_CRH       *((unsigned volatile int*)0x40011004)

3.设置输出模式 为推免模式,输出速度为2Mhz

    GPIOA_CRL&=0xFFF0FFFF;     //设置位 清零GPIOA_CRL|=0x00020000;      //PA4推挽输出,把第19、18、17、16位变为0010GPIOB_CRL&=0xFF0FFFFF;     //设置位 清零GPIOB_CRL|=0x00200000;      //PB5推挽输出,把第23、22、21、20变为0010GPIOC_CRH&=0xFF0FFFFF;      //设置位 清零GPIOC_CRH|=0x00200000;      //PC14推挽输出,把第23、22、21、20变为0010

2.C语言代码实现

(1).流水灯实现

本次实验采用三个灯实现,亮灯状态用1表示,灭灯状态用0表示。
初始状态为0 0 0,
状态一为1 0 0
状态二为0 1 0
状态三为0 0 1
状态三结束后继续进入状态一,一直循环达到流水灯效果。

(2).C语言实现


#include "stm32f10x.h"
//----------------APB2使能时钟寄存器 ---------------------
#define RCC_APB2ENR     *((unsigned volatile int*)0x40021018)
//----------------GPIOA配置寄存器 -----------------------
#define GPIOA_CRL       *((unsigned volatile int*)0x40010800)
#define   GPIOA_ODR     *((unsigned volatile int*)0x4001080C)
//----------------GPIOB配置寄存器 -----------------------
#define GPIOB_CRL       *((unsigned volatile int*)0x40010C00)
#define   GPIOB_ODR     *((unsigned volatile int*)0x40010C0C)
//----------------GPIOC配置寄存器 -----------------------
#define GPIOC_CRH       *((unsigned volatile int*)0x40011004)
#define   GPIOC_ODR     *((unsigned volatile int*)0x4001100C)//延时函数void Delay(){u32 i=0;for(;i<5000000;i++);}int main(void){   RCC_APB2ENR|=1<<2|1<<3|1<<4;           //APB2-GPIOA、GPIOB、GPIOC外设时钟使能GPIOA_CRL&=0xFFF0FFFF;      //设置位 清零GPIOA_CRL|=0x00020000;      //PB5推挽输出GPIOA_ODR&=~(1<<4);          //设置初始灯为灭GPIOB_CRL&=0xFF0FFFFF;     //设置位 清零GPIOB_CRL|=0x00200000;      //PB5推挽输出GPIOB_ODR&=~(1<<5);          //设置初始灯为灭GPIOC_CRH&=0xF0FFFFFF;     //设置位 清零GPIOC_CRH|=0x02000000;      //PB5推挽输出GPIOC_ODR&=~(1<<14);         //设置初始灯为灭while(1){//A灯GPIOA_ODR|=1<<4;      //PB5高电平Delay();GPIOA_ODR&=~(1<<4);      //PB5低电平,因为是置0,所以用按位与//B灯GPIOB_ODR|=1<<5;     //PB5高电平Delay();GPIOB_ODR&=~(1<<5);      //PB5低电平,因为是置0,所以用按位与//C灯GPIOC_ODR|=1<<14;        //PB5高电平Delay();GPIOC_ODR&=~(1<<14);     //PB5低电平,因为是置0,所以用按位与}
}

END

3.stm32cubeMX使用HAL库点亮LED流水灯

1.实验工具

2.STM32CubeMX生成代码使用HAL库点亮流水灯

(1).安装STM32CubeMX

1.安装STN32CubeMX
(1)管理员身份运行安装程序,点击next

(2) 点击"I accept the terms of this license agreement",接着选择Next:

(3)勾选第一个即可

(4)选择安装位置

(5)点击确定
(6)直接点击NEXT,其他不用设置,开始安装

(7)安装完成,点done退出

(2).安装HAL库


STM32 HAL固件库是Hardware Abstraction Layer的缩写,中文名称是:硬件抽象层。HAL库是ST公司为STM32的MCU最新推出的抽象层嵌入式软件,为更方便的实现跨STM32产品的最大可移植性。HAL库的推出,可以说ST也慢慢的抛弃了原来的标准固件库,这也使得很多老用户不满。但是HAL库推出的同时,也加入了很多第三方的中间件,有RTOS,USB,TCP / IP和图形等等。\n和标准库对比起来,STM32的HAL库更加的抽象,ST最终的目的是要实现在STM32系列MCU之间无缝移植,甚至在其他MCU也能实现快速移植。\n并且从16年开始,ST公司就逐渐停止了对标准固件库的更新,转而倾向于HAL固件库和 Low-layer底层库的更新,停止标准库更新,也就表示了以后使用STM32CubeMX配置HAL/LL库是主流配置环境;

(1)打开安装好的STMCubeMX

(2)点击HELP->Manage embedded software packages

(3)会跳出来一个选择型号界面 勾选上你要安装的HAL库,点击"Install Now",直到安装成功。如下图

(3).新建项目

(1)回到STMCubeMX的主界面,创建新项目

(2)在part name里选择自己的芯片,点击信息栏中的具体芯片信息选中,点击start projet

(3)点击system core,进入SYS,在debug下选择serial wire

(4)配置时钟,进入上面的rcc,有两个时钟,一个是hse和lse,我们要用是GPIO接口,而这些接口都在 APB2里

接下来观察时钟架构。APB2总线的时钟由hse控制,同时在这个界面得把PLLCLK右边选上

(5)将hse那里设为Crystal/Ceramic Resonator

(6)接下来就是点击相应的引脚设置输出寄存器了,就是output那一项了,一共选了三个,是PA4,PB9,PC15

(7)点击project manager,配置好自己的路径和项目名,然后IDE那项改为MDK-ARM

(8)进入code generate界面,选择生成初始化.c/.h文件,点击后面generate code,选择open project,然后就到KEIL5了

(4).keil仿真模式

1.打开.uvprojx文件(或者在上一步选择open project)

2.将下面代码放入主函数中(替代里面的内容)

SystemClock_Config();//系统时钟初始化MX_GPIO_Init();//gpio初始化while (1){      HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4亮灯HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯HAL_Delay(1000);//延时1sHAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯HAL_Delay(1000);//延时1sHAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15亮灯HAL_Delay(1000);//延时1s}

3.观察GPIO端口的输出波形
(1)Target界面中,选择跟正确的晶振大小,我使用的是8MHz的外部晶振。这个选项在软件仿真中起到很重要的作用,如果选择错误,那么波形一定是错误的,因为时间不准确。

(2)Debug业的设置

(3)点击Debug,进入调试页面

(4)选择逻辑分析仪

(5)选择要观察的引脚

(6)相关设置

(7)运行程序

(8)观察波形

(9)效果

三.串口通信下连续输出HELLO WINDOWS

1.代码编写


;RCC寄存器地址映像
RCC_BASE            EQU    0x40021000
RCC_CR              EQU    (RCC_BASE + 0x00)
RCC_CFGR            EQU    (RCC_BASE + 0x04)
RCC_CIR             EQU    (RCC_BASE + 0x08)
RCC_APB2RSTR        EQU    (RCC_BASE + 0x0C)
RCC_APB1RSTR        EQU    (RCC_BASE + 0x10)
RCC_AHBENR          EQU    (RCC_BASE + 0x14)
RCC_APB2ENR         EQU    (RCC_BASE + 0x18)
RCC_APB1ENR         EQU    (RCC_BASE + 0x1C)
RCC_BDCR            EQU    (RCC_BASE + 0x20)
RCC_CSR             EQU    (RCC_BASE + 0x24) ;AFIO寄存器地址映像
AFIO_BASE           EQU    0x40010000
AFIO_EVCR           EQU    (AFIO_BASE + 0x00)
AFIO_MAPR           EQU    (AFIO_BASE + 0x04)
AFIO_EXTICR1        EQU    (AFIO_BASE + 0x08)
AFIO_EXTICR2        EQU    (AFIO_BASE + 0x0C)
AFIO_EXTICR3        EQU    (AFIO_BASE + 0x10)
AFIO_EXTICR4        EQU    (AFIO_BASE + 0x14) ;GPIOA寄存器地址映像
GPIOA_BASE          EQU    0x40010800
GPIOA_CRL           EQU    (GPIOA_BASE + 0x00)
GPIOA_CRH           EQU    (GPIOA_BASE + 0x04)
GPIOA_IDR           EQU    (GPIOA_BASE + 0x08)
GPIOA_ODR           EQU    (GPIOA_BASE + 0x0C)
GPIOA_BSRR          EQU    (GPIOA_BASE + 0x10)
GPIOA_BRR           EQU    (GPIOA_BASE + 0x14)
GPIOA_LCKR          EQU    (GPIOA_BASE + 0x18) ;GPIO C口控制
GPIOC_BASE          EQU    0x40011000
GPIOC_CRL           EQU    (GPIOC_BASE + 0x00)
GPIOC_CRH           EQU    (GPIOC_BASE + 0x04)
GPIOC_IDR           EQU    (GPIOC_BASE + 0x08)
GPIOC_ODR           EQU    (GPIOC_BASE + 0x0C)
GPIOC_BSRR          EQU    (GPIOC_BASE + 0x10)
GPIOC_BRR           EQU    (GPIOC_BASE + 0x14)
GPIOC_LCKR          EQU    (GPIOC_BASE + 0x18) ;串口1控制
USART1_BASE         EQU    0x40013800
USART1_SR           EQU    (USART1_BASE + 0x00)
USART1_DR           EQU    (USART1_BASE + 0x04)
USART1_BRR          EQU    (USART1_BASE + 0x08)
USART1_CR1          EQU    (USART1_BASE + 0x0c)
USART1_CR2          EQU    (USART1_BASE + 0x10)
USART1_CR3          EQU    (USART1_BASE + 0x14)
USART1_GTPR         EQU    (USART1_BASE + 0x18) ;NVIC寄存器地址
NVIC_BASE           EQU    0xE000E000
NVIC_SETEN          EQU    (NVIC_BASE + 0x0010)
;SETENA寄存器阵列的起始地址
NVIC_IRQPRI         EQU    (NVIC_BASE + 0x0400)
;中断优先级寄存器阵列的起始地址
NVIC_VECTTBL        EQU    (NVIC_BASE + 0x0D08)
;向量表偏移寄存器的地址
NVIC_AIRCR          EQU    (NVIC_BASE + 0x0D0C)
;应用程序中断及复位控制寄存器的地址
SETENA0             EQU    0xE000E100
SETENA1             EQU    0xE000E104 ;SysTick寄存器地址
SysTick_BASE        EQU    0xE000E010
SYSTICKCSR          EQU    (SysTick_BASE + 0x00)
SYSTICKRVR          EQU    (SysTick_BASE + 0x04) ;FLASH缓冲寄存器地址映像
FLASH_ACR           EQU    0x40022000 ;SCB_BASE           EQU    (SCS_BASE + 0x0D00) MSP_TOP             EQU    0x20005000
;主堆栈起始值
PSP_TOP             EQU    0x20004E00
;进程堆栈起始值             BitAlias_BASE       EQU    0x22000000
;位带别名区起始地址
Flag1               EQU    0x20000200
b_flas              EQU    (BitAlias_BASE + (0x200*32) + (0*4))
;位地址
b_05s               EQU    (BitAlias_BASE + (0x200*32) + (1*4))
;位地址
DlyI                EQU    0x20000204
DlyJ                EQU    0x20000208
DlyK                EQU    0x2000020C
SysTim              EQU    0x20000210 ;常数定义
Bit0                EQU    0x00000001
Bit1                EQU    0x00000002
Bit2                EQU    0x00000004
Bit3                EQU    0x00000008
Bit4                EQU    0x00000010
Bit5                EQU    0x00000020
Bit6                EQU    0x00000040
Bit7                EQU    0x00000080
Bit8                EQU    0x00000100
Bit9                EQU    0x00000200
Bit10               EQU    0x00000400
Bit11               EQU    0x00000800
Bit12               EQU    0x00001000
Bit13               EQU    0x00002000
Bit14               EQU    0x00004000
Bit15               EQU    0x00008000
Bit16               EQU    0x00010000
Bit17               EQU    0x00020000
Bit18               EQU    0x00040000
Bit19               EQU    0x00080000
Bit20               EQU    0x00100000
Bit21               EQU    0x00200000
Bit22               EQU    0x00400000
Bit23               EQU    0x00800000
Bit24               EQU    0x01000000
Bit25               EQU    0x02000000
Bit26               EQU    0x04000000
Bit27               EQU    0x08000000
Bit28               EQU    0x10000000
Bit29               EQU    0x20000000
Bit30               EQU    0x40000000
Bit31               EQU    0x80000000 ;向量表 AREA RESET, DATA, READONLY DCD    MSP_TOP            ;初始化主堆栈 DCD    Start              ;复位向量 DCD    NMI_Handler        ;NMI Handler DCD    HardFault_Handler  ;Hard Fault Handler DCD    0                   DCD    0 DCD    0 DCD    0 DCD    0 DCD    0 DCD    0 DCD    0 DCD    0 DCD    0 DCD    0 DCD    SysTick_Handler    ;SysTick Handler SPACE  20                 ;预留空间20字节 ;代码段 AREA |.text|, CODE, READONLY ;主程序开始 ENTRY                            ;指示程序从这里开始执行
Start ;时钟系统设置 ldr    r0, =RCC_CR ldr    r1, [r0] orr    r1, #Bit16 str    r1, [r0] ;开启外部晶振使能  ;启动外部8M晶振 ClkOk           ldr    r1, [r0] ands   r1, #Bit17 beq    ClkOk ;等待外部晶振就绪 ldr    r1,[r0] orr    r1,#Bit17 str    r1,[r0] ;FLASH缓冲器 ldr    r0, =FLASH_ACR mov    r1, #0x00000032 str    r1, [r0] ;设置PLL锁相环倍率为7,HSE输入不分频 ldr    r0, =RCC_CFGR ldr    r1, [r0] orr    r1, #(Bit18 :OR: Bit19 :OR: Bit20 :OR: Bit16 :OR: Bit14) orr    r1, #Bit10 str    r1, [r0] ;启动PLL锁相环 ldr    r0, =RCC_CR ldr    r1, [r0] orr    r1, #Bit24 str    r1, [r0]
PllOk ldr    r1, [r0] ands   r1, #Bit25 beq    PllOk ;选择PLL时钟作为系统时钟 ldr    r0, =RCC_CFGR ldr    r1, [r0] orr    r1, #(Bit18 :OR: Bit19 :OR: Bit20 :OR: Bit16 :OR: Bit14) orr    r1, #Bit10 orr    r1, #Bit1 str    r1, [r0] ;其它RCC相关设置 ldr    r0, =RCC_APB2ENR mov    r1, #(Bit14 :OR: Bit4 :OR: Bit2) str    r1, [r0]      ;IO端口设置 ldr    r0, =GPIOC_CRL ldr    r1, [r0] orr    r1, #(Bit28 :OR: Bit29)          ;PC.7输出模式,最大速度50MHz  and    r1, #(~Bit30 & ~Bit31)   ;PC.7通用推挽输出模式 str    r1, [r0] ;PA9串口0发射脚 ldr    r0, =GPIOA_CRH ldr    r1, [r0] orr    r1, #(Bit4 :OR: Bit5)          ;PA.9输出模式,最大速度50MHz  orr    r1, #Bit7 and    r1, #~Bit6 ;10:复用功能推挽输出模式 str    r1, [r0]    ldr    r0, =USART1_BRR   mov    r1, #0x271 str    r1, [r0] ;配置波特率-> 115200 ldr    r0, =USART1_CR1   mov    r1, #0x200c str    r1, [r0] ;USART模块总使能 发送与接收使能 ;71 02 00 00   2c 20 00 00 ;AFIO 参数设置             ;Systick 参数设置 ldr    r0, =SYSTICKRVR           ;Systick装初值 mov    r1, #9000 str    r1, [r0] ldr    r0, =SYSTICKCSR           ;设定,启动Systick mov    r1, #0x03 str    r1, [r0] ;NVIC                     ;ldr   r0, =SETENA0 ;mov   r1, 0x00800000 ;str   r1, [r0] ;ldr   r0, =SETENA1 ;mov   r1, #0x00000100 ;str   r1, [r0] ;切换成用户级线程序模式 ldr    r0, =PSP_TOP                   ;初始化线程堆栈 msr    psp, r0 mov    r0, #3 msr    control, r0 ;初始化SRAM寄存器 mov    r1, #0 ldr    r0, =Flag1 str    r1, [r0] ldr    r0, =DlyI str    r1, [r0] ldr    r0, =DlyJ str    r1, [r0] ldr    r0, =DlyK str    r1, [r0] ldr    r0, =SysTim str    r1, [r0] ;主循环
main            ldr    r0, =Flag1 ldr    r1, [r0] tst    r1, #Bit1                 ;SysTick产生0.5s,置位bit 1 beq    main                  ;0.5s标志还没有置位       ;0.5s标志已经置位 ldr    r0, =b_05s                ;位带操作清零0.5s标志 mov    r1, #0 str    r1, [r0] bl     LedFlas mov    r0, #'H' bl     send_a_charmov    r0, #'e' bl     send_a_charmov    r0, #'l' bl     send_a_charmov    r0, #'l' bl     send_a_charmov    r0, #'o' bl     send_a_charmov    r0, #' ' bl     send_a_charmov    r0, #'w' bl     send_a_charmov    r0, #'i' bl     send_a_charmov    r0, #'n' bl     send_a_charmov    r0, #'d' bl     send_a_charmov    r0, #'o' bl     send_a_charmov    r0, #'w' bl     send_a_charmov    r0, #'s' bl     send_a_charmov    r0, #'!' bl     send_a_charmov    r0, #'\n' bl     send_a_charb      main;子程序 串口1发送一个字符
send_a_char push   {r0 - r3} ldr    r2, =USART1_DR   str    r0, [r2]
b1 ldr    r2, =USART1_SR  ldr    r2, [r2] tst    r2, #0x40 beq    b1 ;发送完成(Transmission complete)等待 pop    {r0 - r3} bx     lr ;子程序 led闪烁
LedFlas      push   {r0 - r3} ldr    r0, =Flag1 ldr    r1, [r0] tst    r1, #Bit0 ;bit0 闪烁标志位 beq    ONLED        ;0 打开led灯 ;1 关闭led灯 ldr    r0, =b_flas mov    r1, #0 str    r1, [r0] ;闪烁标志位置为0,下一状态为打开灯 ;PC.7输出0 ldr    r0, =GPIOC_BRR ldr    r1, [r0] orr    r1, #Bit7 str    r1, [r0] b      LedEx
ONLED       ;0 打开led灯 ldr    r0, =b_flas mov    r1, #1 str    r1, [r0] ;闪烁标志位置为1,下一状态为关闭灯 ;PC.7输出1 ldr    r0, =GPIOC_BSRR ldr    r1, [r0] orr    r1, #Bit7 str    r1, [r0]
LedEx        pop    {r0 - r3} bx     lr ;异常程序
NMI_Handler bx     lr HardFault_Handler bx     lr SysTick_Handler ldr    r0, =SysTim ldr    r1, [r0] add    r1, #1 str    r1, [r0] cmp    r1, #500 bcc    TickExit mov    r1, #0 str    r1, [r0] ldr    r0, =b_05s  ;大于等于500次 清零时钟滴答计数器 设置0.5s标志位 ;位带操作置1 mov    r1, #1 str    r1, [r0]
TickExit    bx     lr ALIGN            ;通过用零或空指令NOP填充,来使当前位置与一个指定的边界对齐 END

2.KEIL5项目运行

(1)创建新工程

(2)运行并烧录到芯片中
(3)下载串口调试助手
(4)运行结果

四.实验内容

1.串口通讯方式

(1).设置波特率为115200,一位停止位,无校验位


(2).串口电路图
1、stm32核心板103f一块、usb转串口一块、面包板一块,导线若干
选取接口为GND、RXD、TXD、3V3
TM32核心板选取端口\nG、3.3、A9、A10对应连接
GND-G
3V3-3.3
RXD-A10
TXD-A9

(3).串口波形图

2.LED流水灯实验

(1)LED流水灯电路图
根据设计的程序连接电路:对于USB转TTL模块和stm32f103c8t6连接:GND — GND
3v3 — 3v3
TXD — A10
RXD — A9
总电路:红——B9
绿——C15
黄——A4

(2).点亮LED流水灯

(2)LED流水灯波形图

五.参考文献

https://blog.csdn.net

http://t.csdn.cn/1Shj8

第五、六周--实验作业相关推荐

  1. 20135302魏静静——linux课程第六周实验及总结

    linux课程第六周实验及总结 实验及学习总结 1.进程描述符task_struct数据结构 进程的作用: 将信号.进程间通信.内存管理和文件系统联系起来 操作系统的三大功能: 进程管理.内存管理.文 ...

  2. 2018百度前端技术学院 第五六课 编码作业

    2018百度前端技术学院 第五六课 编码作业 一.课程题目 这节课给出了三份文字内容相同的简历,但是样式布局不一样.题目要求我们使用同一份HTML结构内容,三份不同的CSS代码分别实现图片所示的样式, ...

  3. python第六周实验_机器学习 | 吴恩达机器学习第六周编程作业(Python版)

    实验指导书    下载密码:ovyt 本篇博客主要讲解,吴恩达机器学习第六周的编程作业,作业内容主要是实现一个正则化的线性回归算法,涉及本周讲的模型选择问题,绘制学习曲线判断高偏差/高方差问题.原始实 ...

  4. 机器学习 | 吴恩达机器学习第六周编程作业(Python版)

    实验指导书    下载密码:ovyt 本篇博客主要讲解,吴恩达机器学习第六周的编程作业,作业内容主要是实现一个正则化的线性回归算法,涉及本周讲的模型选择问题,绘制学习曲线判断高偏差/高方差问题.原始实 ...

  5. 201771010110孔维滢《面向对象程序设计Java》第十六周实验总结

    理论知识部分: 1.程序与进程: 程序是一段静态的代码,它是应用程序执行的蓝本. 进程是程序的一次动态执行,它对应了从代码加载.执行至执行完毕的一个完整过程. 2.多线程 多线程是进程执行过程中产生的 ...

  6. 第五六周机电传动控制作业

    到西门子.ABB.施耐德或其他公司的官网上,选择4款或以上低压电器产品(如接触器.断路器.热继电器等),阅读技术数据,并简要列出主要额定参数 西门子: SIRIUS(国产)3RV6/3RV5 接触器: ...

  7. 第六周实践作业:软件测试和评估

    一.计划说明 1.对比测试产品:百词斩.扇贝单词 2.测试进度表如下表所示:                                                               ...

  8. python第六周实验_第六周实验四

    二.实验的内容 (1)根据下面的要求实现圆类Circle. 1.圆类Circle的成员变量:radius表示圆的半径. 2.圆类Circle的方法成员: Circle():构造方法,将半径置0 Cir ...

  9. 十六周实验报告 任务二

    源程序: #include <iostream> #include <fstream> #include <iomanip> #include <string ...

最新文章

  1. PTA---指针错误汇总(就自己做个笔记)
  2. 软件测试2019:第四次作业
  3. 大唐杯5g题库_“大唐杯”全国大学生移动通信技术大赛暨5G教育创新论坛成功举行...
  4. for表达式的语句执行顺序?
  5. nodejs sqlite3_NodeJS 使用 better-sqlite3 操作sqlite 数据库
  6. 遵义医科大学计算机专业好吗,遵义医科大学专业评价
  7. 使用 C# 捕获进程输出
  8. python webbrowser点击_用 Python 实现手机自动答题,这下百万答题游戏谁也玩不过我!...
  9. 2021年中国电竞运动行业发展报告
  10. 过河卒(信息学奥赛一本通-T1314)
  11. 理想汽车回应被列入“预摘牌名单”:积极配合审计底稿相关的工作
  12. 提示不支持IE6的脚本
  13. Atitit 知识管理的艺术 艾提拉著作 这个实际上涉及到知识的管理(获取 ,存储,索引,查找等方法 目录 1. 记不住的本质 2 1.1. 真的没有记住 2 1.2. 暂时没有搜索到,可能是
  14. EPUB阅读工具-读者推荐
  15. 将超星图书转成PDF文档
  16. JavaScript代码收集
  17. gRPC服务发现负载均衡
  18. java开发人员的小习惯
  19. 大数据之scala学习(一) 案例操作
  20. 操作系统中生产者/消费者问题(一)

热门文章

  1. MySQL中的CRUD操作( Create, Retrieve,Update,Delete)
  2. flink报错:incompatible types for field cpuCores
  3. Windows工作组环境下账户和组的管理
  4. 【CubeIDE】STM32 HAL库史上最详细教程(一):UART串口收发
  5. PHPMailer邮箱发送参数配置
  6. 5G智慧校园建设顶层设计方案智慧校园大脑建设方案
  7. 推荐一款能让照片动起来的APP
  8. 解决“产品运行所需的信息检索失败。请重新安装xshell”
  9. 酒店管理系统升级(.net4.0 + sql2005 + linq to sql)
  10. ShareSDK 第三方平台注册指南