[硬石开发板] 硬石开源资料下载
【MCU】寄存器、标准库、HAL库、LL库,这么多库!你叫我怎么选?
STM32每个GPIO都可以作为中断输入引脚
配置中断的步骤
__HAL_RCC_AFIO_CLK_ENABLE();
__HAL_AFIO_REMAP_SWJ_NOJTAG(); //关闭JTAG
DBGMCU->CR &= ~((uint32_t)1<<5); //关闭异步跟踪,否则PB3将一直读出0
memcpy是一个拷贝函数
//不使用DMA
/* 不使用DMA传输数据到电脑端 */
HAL_UART_Transmit(&huart1,txbuf,strlen((char *)txbuf),1000);
/* 使能接收,进入中断回调函数 */
HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);
/**
* 函数功能: 串口接收完成回调函数
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
HAL_UART_Transmit(&huart1,&aRxBuffer,1,0);
// HAL_UART_Transmit_DMA(&huart1,aTxBuffer, SENDBUFF_SIZE);
HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);
}
//使用DMA
/* 使用DMA传输数据到电脑端 */
HAL_UART_Transmit_DMA(&huart1,aTxBuffer, SENDBUFF_SIZE);
/* 使能接收,进入中断回调函数 */
HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);
/**
* 函数功能: 串口接收完成回调函数
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
HAL_UART_Transmit(&huart1,&aRxBuffer,1,0);
// HAL_UART_Transmit_DMA(&huart1,aTxBuffer, SENDBUFF_SIZE);
HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);
}
视频
DYS串口助手 V1
usrat.h
PA9、PA10对应的USART1
#define EN_USART1 1 //使能(1)/禁止(0)串口1
#define EN_USART2 0 //使能(1)/禁止(0)串口2
#define EN_USART3 0 //使能(1)/禁止(0)串口3
单片机接收数据有中断和查询两种方式
查询方式
关闭串口中断
usart.c
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//开启ENABLE/关闭DISABLE中断
中断方式实时性好
打开串口中断
《STM32固件库使用手册》
usat.c
void USART1_IRQHandler(void){ //串口1中断服务程序(固定的函数名不能修改)
u8 a;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){ //接收中断(接收到的数据必须是0x0d 0x0a结尾)
a =USART_ReceiveData(USART1);//读取接收到的数据
printf("%c",a); //把收到的数据发送回电脑
}
}
超级终端USART控制STM32开发板
配置方法
超级终端下载连接
打开文件—>新建连接,连接类型选平时择编译的端口,我这里是COM4
关闭连接 :点击右键然后关闭
全局变量:
usat.c
u16 USART1_RX_STA=0; //接收状态标记,
usart.h
extern u16 USART1_RX_STA; //接收状态标记,声名
发送两个字节的数据大概花时160us,硬件IIC的速度80us左右
I2C的地址是由一个7位的16进制数表示,所以同一个I2C总线最多能挂载127个设备
STM32主设备地址自己设定(0Xc0)
i2c.h
#define HostAddress 0xc0 //总线主机的器件地址
LM75A
高四位是固定的,最后一位是读写标志位
1001 1110——9E
lm75a.h
#define LM75A_ADD 0x9E //器件地址
I2C_SAND_BYTE(LM75A_ADD,0x01,1);
void LM75A_GetTemp(u8 *Tempbuffer){
u8 *Tempbuffer 是定义了一个指向内存存储区的指针,访问数据的类型为u8(无符号单字节)
视频
GPIO_Initure.Pin=GPIO_PIN_0; //PA0
GPIO_Initure.Mode=GPIO_MODE_INPUT; //输入
// GPIO_Initure.Pull=GPIO_PULLDOWN; //下拉
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
STM32的I/O口的8种工作模式
抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
系统代码执行过程中,只设置一次中断优先级分组
中断优先级分组函数:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
在代码里寻找IO口模式:
Go To Definition Of ‘…’
HAL_GPIO_Init
IS_GPIO_MODE
STM32的每个IO都可以作为外部中断输入。
STM32的中断控制器支持19个外部中断/事件请求:
线0~15:对应外部IO口的输入中断。
线16:连接到PVD输出。
线17:连接到RTC闹钟事件。
线18:连接到USB唤醒事件。
每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。
STM32 输入捕获工作过程
通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。
DSD板
正点原子
SDA:数据线
SCL:时钟
空闲状态:I2C总线的SDA和SCL两条信号线同时处于高电平时,两条信号线各自的上拉电阻把电平拉高。
起始信号:当SCL为高期间,SDA由高到低。
停止信号:当SCL为高期间,SDA由低到高。
应答信号:
R/W:写0,读1
485接口用缆线两端的电压差值来表示传递信号。
RS485仅仅规定了接受端和发送端的电气特性。它没有规定或推荐任何数据协议。
RS485总线最长可以传输1200m以上(速率 ≤100Kbps)一般最大支持32个节点,如果使用特制的485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点。
理想情况下RS485需要2个匹配电阻,其阻值要求等于传输电缆的特性阻抗(一般为120Ω)。
收发器SP3485
图中A、B总线接口,用于连接485总线。RO是接收输出端,DI是发送数据收入端,RE是接收使能信号(低电平有效),DE是发送使能信号(高电平有效)。
硬件连接(战舰)
1)R19和R22是两个偏置电阻,用来保证总线空闲时,AB之间的电压差都会大约200mV,避免总线空闲时压差不定逻辑混乱。
2)两个485接口连接,A连接A,B连接B。
在线编程(ICP)
通过JTAG/SWD协议或者系统加载程序(Bootloader)下载用户应用程序到微控制器中。
在程序中编程(IAP)
STM32允许用户在应用程序中重新烧写闪存存储器中的内容。然而,IAP需要至少有一部分程序已经使用ICP方式烧到闪存存储器中(Bootloader)
STM32的闪存模块由:主存储器、信息块和闪存存储器接口寄存器等3部分组成。
(1)主存储器,该部分用来存放代码和数据常数(如const类型的数据)。对于大容量产品,其被划分为256页,每页2K字节。注意,小容量和中容量产品则每页只有1K字节。从上图可以看出主存储器的起始地址就是0X08000000, B0、B1都接GND的时候,就是从0X08000000开始运行代码的。
(2) 信息块,该部分分为2个小部分,其中启动程序代码(系统存储器),是用来存储ST自带的启动程序,用于串口下载代码,当B0接V3.3,B1接GND的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能。
(3)闪存存储器接口寄存器,该部分用于控制闪存读写等,是整个闪 存模块的控制机构。
malloc函数用于内存申请,free函数用于内存释放。
分块式内存管理——原理
分块式内存管理由内存池和内存管理表两部分组成。
内存管理表的项值代表的意义:当该项值为0的时候,代表对应的内存块未被占用,当该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。
内寸分配方向:是从顶底的分配方向。即首先从最末端开始找空内存。
把最后的这个空内存块的地址返回指针p
对于STM32F103xxyy系列:
第一个x代表引脚数:T-36pin,C-48pin,R-64pin,V-100pin,Z-144pin;
第二个x代表Flash容量:6-32K,8-64K,B-128K,C-256K,D-384K,E-512K;
第一个y代表封装:H-BGA封装,T-LQFP封装,U-QFN封装;
第二个一代表工作稳定范围:6代表-40到85摄氏度,7代表-40到105摄氏度。