文章目录
一.通信协议
1.协议
协议
意思是共同计议,协商;经过谈判、协商而制定的共同承认、共同遵守的文件。
在我们的单片机之间互相通信,以及单片机和上位机通信中,规定了不同的内容规范,这个规范是通信的双方都需要遵守的,这样就可以实现两者的通信。
这个协议规范可以有很多种,来适应不同的设备以及通信要求等,我们常见的就有IIC
SPI
UART
串口通信协议等等。
2.RS-485 RS-232
RS232
RS485
是一种电平标准
数据在通信双方之间传输,本质是传输物理的电平
比方说传输5V的电压 -1V的电压信号,这些物理信号在传输过程中会受到很多干扰,比方说你传输一个5V的电压,到了接收端可能就变成了4.8V,并且通信的双方高低电平的参考电压可能不同。
那么这个时候就需要一个电平标准,来判断多少V的电压是高电平 1,多少V的电压是低电平 0 这就诞生了 RS-485 RS-232
RS232
:是电子工业协会(Electronic Industries Association,EIA) 制定的异步传输标准接口,同时对应着电平标准和通信协议(时序),其电平标准:+3V~+15V对应0,-3V~-15V对应1。
全双工
逻辑1:-15V–—— -3V
逻辑0: +3V–——+15V
RS485
:RS485是一种串口接口标准,为了长距离传输采用差分方式传输,传输的是差分信号,抗干扰能力比RS232强很多。两线压差为-2——-6V表示0,两线压差为+2——+6V表示1
半双工
逻辑1:+2V~+6V
逻辑0: -2V~ -6V
注意
RS485的电平指的是485-A和485-B两根传输线,两线间的电压差。而不是传输线上的电压
TTL电平
信号规定,+5V等价于逻辑“1”,0V等价于逻辑“0”(采用二进制来表示数据时)。这样的数据通信及电平规定方式,被称做TTL(晶体管-晶体管逻辑电平)信号系统。这是计算机处理器控制的设备内部各部分之间通信的标准技术
3.USB/TTL转232模块
首先,为什么要进行转换?
因为单片机通信接口的电平逻辑和PC机通信接口的电平逻辑不同。
PC机上的通信接口有USB接口,相应电平逻辑遵照USB原则;还有DB9接口(九针口),相应电平逻辑遵照RS-232原则。
而单片机上的串行通信通过单片机的RXD、TXD、VCC、GND四个引脚,相应电平逻辑遵照TTL原则。
转换的目的是把电平转换到双方都能识别。
USB转TTL串口模块是一个非常实用的工具,可以测试模块的UART串口通信和通过单片机的UART接口给单片机等下载程序。
能够在电脑上的串口助手软件非常直观的显示出串口设备返回的数据以及发送相应的控制数据给串口设备。
信号转换
CH340
是一个USB 总线的转接芯片,实现USB 转串口、USB 转IrDA 红外或者USB 转打印口。- 为了增加串口通讯的远距离传输及抗干扰能力,RS-232标准使用-15V 表示逻辑 1, +15V 表示逻辑 0。 常常会使用
- MH340芯片对 USB/TTL与RS-232电平的信号进行转换。
对单片机的作用
USB转串口电路板与单片机的接线图,VCC接线是为了单片机供电,USB转串口的RXD引脚与单片机的TXD引脚相连,USB转串口的TXD引脚与单片机的RXD引脚相连,两者的GND引脚直接相连
二.LED流水灯实验
1.寄存器地址方式实现LED流水灯
1.创建工程
2.选择STM32F103C8开发板,只勾选CORE
3.选择生成hex文件
led代码:
#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800
#define RCC_APB2ENR (*(unsigned int *)0x40021018)
#define GPIOB_CRH (*(unsigned int *)0x40010C04)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL (*(unsigned int *)0x40010800)
#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
void SystemInit(void);
void Delay_ms(volatile unsigned int);
void A_LED_LIGHT(void);
void B_LED_LIGHT(void);
void C_LED_LIGHT(void);
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
void A_LED_LIGHT(){
GPIOA_ODR=0x0<<5; //PA5???
GPIOB_ODR=0x1<<9; //PB9???
GPIOC_ODR=0x1<<14; //PC14???
}
void B_LED_LIGHT(){
GPIOA_ODR=0x1<<5; //PA5???
GPIOB_ODR=0x0<<9; //PB9???
GPIOC_ODR=0x1<<14; //PC14???
}
void C_LED_LIGHT(){
GPIOA_ODR=0x1<<5; //PA5???
GPIOB_ODR=0x1<<9; //PB9???
GPIOC_ODR=0x0<<14; //PC14???
}
int main(){
int j=100;
// ????
RCC_APB2ENR |= (1<<3); // ?? GPIOB ??
RCC_APB2ENR |= (1<<4); // ?? GPIOC ??
RCC_APB2ENR |= (1<<2); // ?? GPIOA ??
// ?? GPIO ?????
GPIOB_CRH&= 0xffffff0f; //??? ??
GPIOB_CRH|=0x00000020; //PB9????
GPIOC_CRH &= 0x0fffffff; //??? ??
GPIOC_CRH|=0x02000000; //PC14????
GPIOA_CRL &= 0xfff0ffff; //??? ??
GPIOA_CRL|=0X00200000; //PA5????
// 3?LED??????(????)
GPIOB_ODR |= (1<<9);
GPIOC_ODR |= (1<<14);
GPIOA_ODR |= (1<<5);
while(j){
B_LED_LIGHT();
Delay_ms(1000000);
C_LED_LIGHT();
Delay_ms(1000000);
A_LED_LIGHT();
Delay_ms(1000000);
}
}
void SystemInit(){
}
5.build
6.添加驱动文件
7.线路连接
8.烧录
led流水灯
2.HAL库实现LED流1灯
1).STM32cubeMX建立工程
1.下载hal库,点击HELP->Manage embedded software packages
2.跳出来一个选择型号界面 勾选上要安装的HAL库, 点击“Install Now” 直到安装成功。 如下图
3.新建项目
4.在part name里选择STMF103C8芯片,点击信息栏中的具体芯片信息选中,点击start project:
5.击system core,进入SYS,在debug下选择serial wire:
6配置时钟,进入上面的rcc我们要用是GPIO接口,而这些接口都在APB2:
7.观察时钟架构,APB2总线的时钟由hse控制,同时在这个界面得把PLLCLK右边选上
8.点击相应的引脚设置输出寄存器了,就是output那一项,一共选了三个,是PA5,PB9,PC14:
9.点击project manager,配置好自己的路径和项目名,然后IDE那项改为MDK-ARM
10.进入 code generate界面,选择生成初始化.c/.h文件,后面点击generate code,选择open project,然后就到KEIL5
2).keil仿真调试
1.打开main.c文件,滑倒主函数那一部分:
2.将下面代码放入主函数中(替代里面的内容)
SystemClock_Config();//系统时钟初始化
MX_GPIO_Init();//gpio初始化
while (1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);//PA5亮灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//PC14熄灯
HAL_Delay(1000);//延时1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//PA5熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//PC14熄灯
HAL_Delay(1000);//延时1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//PA5熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);//PC14亮灯
HAL_Delay(1000);//延时1s
}
3.调整参数
4.build,生成hex文件
5.电路连接
根据设计的程序连接电路:
对于USB转TTL模块和stm32f103c8t6连接:
GND — GND
3v3 — 3v3
TXD — A10
RXD — A9
总电路:
黄——A5
绿——B9
红——C14
6.烧录运行
串口烧录要断电之后把boot0置0才能正常运行
3.观察GPIO波形图
1.设置晶振参数为8MHZ
2.设置debug页参数,如图所示
3.点击Debug,进入调试界面
4.选择逻辑分析仪
5.选择要观察的引脚:
①点击Setup Logic Analyzer
②添加要观察的引脚:
6.相关设置
7.运行程序,观察波形
三.USART串口通讯程序
1.工程创建
1.设置RCC,设置高速外部时钟HSE 选择外部时钟源
2.设置串口
1
点击USATR1
2
设置MODE为异步通信(Asynchronous)
3
基础参数:波特率为115200 Bit/s
4
GPIO引脚设置 USART1_RX/USART_TX
5
NVIC Settings 一栏使能接收中断
3.设置时钟
1
选择外部时钟HSE 8MHz
2
系统时钟来源选择为PLL
3
设置APB1分频器为 /2
4.项目文件设置
5.创建工程文件
然后点击GENERATE CODE
创建工程
2.keil仿真
1.自行选择下载模式,勾选上下载后复位运行
2.重新定义printf函数
在 stm32f1xx_hal.c中包含#include <stdio.h>
#include "stm32f1xx_hal.h"
#include <stdio.h>
extern UART_HandleTypeDef huart1; //声明串口
在 stm32f1xx_hal.c 中重写fget和fput函数
/**
* 函数功能: 重定向c库函数printf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
/**
* 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
在main.c中添加
#define RXBUFFERSIZE 256
char RxBuffer[RXBUFFERSIZE];
while (1)
{
/* USER CODE END WHILE */
printf("hello windows!\n");
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
3.烧录运行
串口烧录要断电之后把boot0置0才能正常运行
1
.打开文件
2
.打开串口
3
.窗口开始出现“hello windows!”
3.观察GPIO波形图
1.debug
打开波形分析仪
选择setup
设置观察对象
输入USART1_SR
观察波形