大纲
前沿:无论学习传统寄存器编程还是库函数编程,都学要学会看数据手册和用户手册,实际工作中不可能手把手教你
每一个外设的函数或者寄存器怎么配,其实作为单片机工程师就是一个体力活,因为你只是在遵循芯片厂商的规则进行
配置一系列寄存器而已。在编程中要有一种变化的思维,第一点,比如使用某一个外设,需要配置其基本参数,如时钟,端口和
引脚,作为输入还是输出,作为传统输出还是服用功能输出。是否需要配置中断,以及设置中断优先级和某个外设中断
使能,编写实现功能的中断函数。第二点,一般情况下单片机与外界交换,无外乎就是收发,对于发送,需要检测其是否
发送成功,有发送成功的事件或中断标志位。接收,判断是否接受成功,如果是使用中断标志位,则在进入中断函数后,需要
清除中断标志位。最后,最重要的是逆行要实现怎么样的功能,单片机无外乎不就是引脚以及引脚的复用功能,如TIM、ADC、
DAC、CAN、I2C、USART、SPI、USB等等。作为提升自己的方式,我们需要学习上位机开发,可以用C#开发上位机,也可以
用QT开发上位机。
总之,嵌入式开发主要就是脸+脑 ==通讯协议 === 舌头+手。其中脸是用户界面,脑是数据库 。舌头是传感器,手是电机。
他们之间形成交互,通过通讯协议进行传输数据。
PLC就是大型的单片机,常常用于工业电机的控制。而运动控制板卡是工业机器人的控制。
1.学什么
2.怎么学
3.物理层面的基本电路
4.库函数的基本理念(HAL库和FW库)+内容概要
5.中断和事件的区别,一定要有中断吗?
6.串口存在的意义
7.TIM及其应用
8.WWDG 存在的意义
9.SYSTICK 存在的意义
1.学什么
(1)片上外设
如GPIO、TIM、EXTI、SYSTICK等
(2)模拟数字转换
如ADC\DAC
(3)通信协议
如I2C、USART/UART、SPI、TCP/IP、CAN等
2.怎么学
嵌入式软件工程师做学硬件的话基础要会焊贴片芯片、贴片元件,这个很重要!!!而且要保证焊出来的板子可以正常工作,
出了问题自己去找出问题然后解决掉。要会使用软件绘制原理图和PCB。其他的知识个人觉得多做项目,可以是公司项目,也可以
自己做一些小制作,在这个制作过程中需要用到什么硬件知识再去学习,会更有效一点。
3.物理层面的基本电路
1)推挽模式:
状态:1/0
2)开漏模式:上拉电阻电压由负载额定电压决定。
状态:0或截止
3) 斯密特触发器
TTL电平,输入后输出有不同的比较值
当选择输入时,如果大于该比较值,则触发器输出1;
如果低于该比较值,则触发器输出0;
4)上拉/下拉输入电路
其意义是保证引脚电平在一个确定的状态下,常常配合开关或其他触发方式使用。
4.库函数的基本理念(HAL库和FW库)
固件库是指“STM32标准函数库”,它是由ST公司针对STM32提供的函数结构。即API(application program Interface),开发者可以调用函数接口来配置STM32的寄存器。
(1)相似之处:主要由CR、SR、DR(事件或中断)组成,具体如下表所示
CR:配置相关外设或协议初始化
SR: 判断引脚的状态
DR: 读取或写入数据
寄存器 |
对应库函数命名 |
CR Control Register |
对一些外设初始化\使能一些事件或中断 xxx_Init() 如USART_Init()、GPIO_Init() xxx_cmd() 如 USART_IT()、TIM_Cmd() |
DR Date Register |
发送和接收数据 Xxx_SendData()、xxxReceiveData() |
SR Situation Register |
一些事件或中断的标志位 Xxx_GetFlagStatus()、xxx_GetITStatus() Xxx_ClearFlag()、xxx_ClearITPend-ingBit() |
(2)固件库的基本内容
1.汇编编写的启动文件
名称:Startup_stm32f10x_hd.s
主要作用:设置C语言运行环境。
主要内容:设置堆栈指针,设置PC指针,初始化中断向量表,设置系统时钟systemInit。
2.时钟配置文件
System_stm32f10x.c; 把外部的HSE(外部高速时钟)=8M,经过锁相环配置成72M。
3.外设相关的
Stm32f10x.h //peripheral register reflect GPIOA_BASE 0XFFFFFFFF
外设基地址,以及相应的寄存器的结构体 以及由外设基地址组成的结构体函数。
实现相应功能的库
Stm32f10x_xx.c //外设的驱动函数库文件
Stm32f10x.xx.h //头文件,存放外设(GPIOx)的初始化结构
Stm32f10x_conf.h //包含所有外设的头文件,可以选择是否启用
4.专门存放中断服务函数的C文件
stm32f10x_it.h
stm32f10x_it.c
(注:中断服务函数可以随意放在其他地方,并不一定要放在.c文件中)
5.中断和事件的区别
中断需要中断服务函数NVIC等一些列配置,而事件不需要软件,它是直接通过硬件方式联动。
图中输入线1(I/O口)信号进入,通过信号检测(触发方式):(上升沿、下降沿、上升下降沿检测),
进入3之前,是设置软件中断/事件。
中断通过NVIC控制和中断屏蔽器相与。
事件与事件屏蔽寄存器相与,通过脉冲发生器 产生电平的反转实现时间产生
一定要有中断吗?
(1)设备与外界通信,如CAN,上位机发送消息过来,这时候程序如果运行很慢,错过消息,
就不自信串口的命令,最好写入中断。
(2)你会知道什么时候产生中断吗?
只有外界触发时,如外部中断导致引脚电平变换,内部中断定时器,计时到了产生中断,CAN通信
接收到消息产生中断,这些都是硬件去检测,本质检测的是寄存器是否被置位,至于你(人)不知道是否
什么时候中断,中断之所以有优先级,是因为需要考虑很多,如火车行驶中前面两个路口,有一个人和多个人
,死一个人和死多个人,当然选择死一个人。
(3)对于嵌入式工程师,只要调用其库函数接口可以,如CAN发送和接收的接口,自己在封装下可以使用,
发送即可字节自己定义。对于串口,重定向后直接使用库函数发送和接收,自己封装无外乎是发送一个字节,还是发送多个字节而已。
6.串口的作用
1)调试程序,上位机与下位机交互
2)烧录程序
7.TIM及其应用
8.WWDG 存在的意义
9.SYSTICK 存在的意义
系统定时器是属于作为CM3/4内核外设,内部嵌套在NVIC中。系统定时器是一个24bit的向下递减的计数器。
这里需要考虑两点:计数器每计数一次的时间:与配置其始终有关。
产生一次中断的时间:计数24次后的时间。
//设计流程
//将core_cm3/4中有关systick函数移植过来
//1.配置重装载值,复位,以及定时器NVIC配置 config_systicks(xxx)
//2.初始化systicks,可以确定多久中断一次
//3.配置中断函数,并将它发到it.h中 ,其中参数变量在延时函数中赋值
//4.编写相应的延时函数
//5.根据要求调用系统滴答函数
未完待续
更新日期:2021-10-13 \19:54:44