简析强制类型转换
上图的意思是将pData这个变量的地址强制转换为uint32_t类型的地址并赋予指针变量tmp,然后在下面那个函数的第二个参数中是取指针变量tmp这个被强制转化为uint32_t类型后的地址所指向变量的值
定时器
一般情况下f103所有定时器的时钟频率都是设置为72MHz的。
基本定时器
重新定义HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
初始化之后要启动TIM
通用定时器
Period 时期 pulse占空比
独立看门狗初识
“看门狗”(WatchDog):用于检测单片机程序运行状态的模块或者芯片。
在系统跑飞(程序异常执行)时,系统复位,程序重新启动。
I2C通信协议
I2C是一个支持多设备的总线。总线是指多个设备共用的信号线。
I2C总线只使用两条总线线路,一条双向串行数据线(SDA),一条串行时钟线(SCL)。
总线通过上拉电阻接到电源,当I2C设备空闲时,会输出高阻态。当所有设备都输出高阻态时,由上拉电阻把总线拉成高电平。
I2C数量受到总线的最大电容400pf的限制
线与&:低电平优先级高(可以占据总线)
ACK (Acknowledge character)即是确认字符
在线与的逻辑里,低电平有更高的优先级
EEPROM的地址由硬件决定
即0xA0
填写数据到EEPROM
地址和页对其
1.先算能放满多少页
2.再取余
地址不和页对齐
- 先算当前页还剩多少字节
- 将得到的字节数先填满
- 再按张上面对齐的方式去写入数据
HAL_I2C_Mem_Read(&I2C_handle, EEPROM_ADDRESS,ReadAddr, I2C_MEMADD_SIZE_8BYTE, (uint8_t *)BufferSize )
接下来是添加bsp_sys.h、bsp_delay.h、bsp_delay.c、
bsp_i2c.c、bsp_i2c.h、bsp_24cxx.c 、bsp_24cxx.h 这几个文件
其中bsp_i2c.c、bsp_i2c.h主要是软件模拟I2c的代码,只要是IIC通信协议都可以用,很方便移植
bsp_24cxx.c、bsp_24cxx.c是EEPROM 24c02的板级支持包
在bsp_i2c.c正点的教程和程序历程代码有些不一样
先判断再赋值
直接运算赋值
正点的例程里有读写一个Byte,读写一个lenByte
野火例程中有通过缓冲区读写页的函数
下面是写一个字节的函数
IIC初始化(IO输出模式问题)
也即是说如果不用多个主设备的话,推挽上拉也是可以的。
其实还是用7,即0111 (开漏输出)比较保险。
双向口
HAL_I2C_Mem_Write(&I2C_Handle, EEPROM_ADDRESS, (uint16_t)WriteAddr, I2C_MEMADD_SIZE_8BIT, pBuffer, 1, 100);
将之前的串口程序移植到IIC读写EEPROM程序的时候报错
为什么我用的是usart1,使用的确是stm32f1xx_hal_uart.c
Cube自动配置的也是stm32f1xx_hal_uart.c?
因为我把USART1配置成UART(异步通信)模式
只有stm32f1xx_hal_uart.c 里面才有HAL_UART_Init(),HAL_UART_Transmit(),HAL_UART_Receive等函数
不过反正遇到上述情况,那就拿那些可以用的程序来对照,缺啥补啥就行
要注意初始化的顺序
如果某一个外设的初始化出现的了问题,可以把它移到系统时钟初始后边试试