【单片机学习笔记】(22):强制类型转换、定时器、独立看门狗初识、I2C通信协议(软件模拟IIC、串口程序移植)

 简析强制类型转换

上图的意思是将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.再取余

地址不和页对齐

  1. 先算当前页还剩多少字节
  2. 将得到的字节数先填满
  3. 再按张上面对齐的方式去写入数据

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等函数

不过反正遇到上述情况,那就拿那些可以用的程序来对照,缺啥补啥就行

要注意初始化的顺序

如果某一个外设的初始化出现的了问题,可以把它移到系统时钟初始后边试试

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值