使用STM32C103C8T6的注意点


前言

本文主要讲了在用STM32F103C8T6时发现的一些问题,对这些问题的解决方案或者是理解,而不是写如何敲代码的,那样的文章在CSDN上已经很多很完善了。将问题记录在此,为了存档。更是可以和大家一起分享。


以下是本篇文章正文内容,本人才疏学浅,如有错误,还请大家多多指教。

一.IIC

配置IIC的时候更改源文件中IIC_Init()里的GPIO配置、头文件中位带操作是不用多说的,但是在头文件中还有一处寄存器值需要更改。如下所示。

//驱动接口,GPIO模拟IIC
//SCL-->PB6
//SDA-->PB7
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}

CRL是端口配置低寄存器,含有32位,如下图所示。(详见STM32中文参考手册8.2小节寄存器描述)
在这里插入图片描述
对第一行代码进行解释,第二行请读者自行思考:

STM32F103C8T6每个GPIO口有十六个引脚,PA0-PA15;PB0-PB15等等。CRL寄存器控制低八位引脚,每4位寄存器值控制一个引脚,比如说CRL寄存器的0-3控制GPIOB的PB0;CRL寄存器的28-37则控制PB7;
首先是GPIOB->CRL这个寄存器与上0x0FFFFFFF,这是一个8位的16进制数(刚好对应八个引脚),所以对应的就是32位的2进制数(1个16进制是4位2进制数)。所以说这个寄存器是32位的,这分句的意思是先将最后4位置0,其余位不改变.后面有GPIOB->CRL|=(u32)8<<28;这个分句的意思是将1000左移28位也就是移到了控制PB7的28-31位,这时根据下方的功能表可以得出此时将PB7配置成了上拉/下拉输入模式,也对应了SDA_IN的IN,下面一行代码则是将PB7配置成了通用推挽输出。
所以在配置IIC的时候还要看自己现在的端口是几号引脚,更改置位的寄存器位数和左移的位数。


二.PWM输出

这次用的是定时器1作为PWM输出,定时器1是高级定时器,高级就高级在用起来麻烦,哈哈。 至于高级在何处可以在CSDN上搜索一下,有详细的解释与说明。在PWM输出时,需要在输出比较初始化之后和预装载前加一行代码,当然不一定非要放在这个位置,但可以保证放在这个位置可以用。
代码如下(第三行):

	TIM_OC2Init(TIM1, &TIM_OCInitStructure);
	TIM_OC3Init(TIM1, &TIM_OCInitStructure);
	TIM_CtrlPWMOutputs(TIM1,ENABLE);
	TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
	TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);

还有一点是,如果在输出PWM波的时候如果发现高低电平的时间与自己预想的结果恰恰相反,那很有可能是PWM的输出模式写错了。

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

如果是PWM1的话改成2,如果是2的话改成1。


三.编码器

3.1定时器的单一模式性

每个定时器只能用作一种功能,而编码器又尤其的喜欢占位置,STM32F103定时器1、2、3、4、5、8有编码器的功能,而在这几个定时器中也只有CH1和CH2有编码器模式,所以当你把一个定时器用作编码器之后,CH3和CH4只能当作普通IO口来用了。我之前就将自己的PWM输出和编码器放在同一个定时器下,这就产生了问题。一个定时器只能干一件事

3.2端口复用与重映射

复用:当我们不是单纯把引脚当作默认功能的时候就称之为复用(绝大多数引脚的默认功能都是IO口),这时候需要开启复用时钟,比如说将IO口用作定时器。
代码如下:

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

虽然很多时候不写这行代码也能用。

重映射:以TIM3为例(更多可见STM32中文参考手册8.3小节)
没有重映射时TIM3的CH1、CH2默认在PA6、PA7上,但是可以把PC6、PC7用作TIM3的CH1和CH2,也就是下表写的完全重映射,只需要在GPIO配置后加上重映射配置。
代码如下(复用时钟是第三行,完全重映射是最后一行):

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);

如果想要使用部分重映射则需要将重映射的第一个入口参数改成GPIO_PartialRemap_TIM3
在这里插入图片描述


四.关闭JTAG

PA15,一个神奇的引脚,默认功能是JTAG,因为我用不到JTAG下载器。所以想用PA15这个引脚的时候都需要将JATG关闭并开启复用时钟。
代码如下(第一行开启复用时钟,第二行关闭JTAG):

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;							
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;				//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;				//ID口速度为50MHz
	GPIO_Init(GPIOA, &GPIO_InitStructure);									//初始化PA15

五.定时器多用

定时器可以同时用作计数器和串口使用。
刚刚不是还说一个定时器只能用作一个功能,这就来打自己的脸了。
因为当定时器用作计数器的时候只需要用到定时器的配置和定时器中断,而串口则是需要端口配置、串口配置和串口中断,所以说这两个功能完全没有互相干扰的情况,是可以同时使用。下表就列一下哪两个功能是肯定不能同时使用的。

功能
PWM输入/输出
输入捕获
输出比较
强制输出
输入异或
计数器
编码器

总结

本文介绍了几个在使用STM32F103C8T6时发现的几个小问题,国赛将至,应该有一段时间不会使用F1了,记录在此,方便回忆。

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,它具有丰富的外设和强大的性能,广泛应用于嵌入式系统开发。而非接触液位传感器DR-01是一种用于测量液体或粉体物料液位的传感器。 该传感器采用非接触式工作原理,通过感应液体或粉体物料的电磁场变化来测量液位。它具有以下特: 1. 非接触式测量:传感器与被测物料无需直接接触,避免了污染和损坏的风险。 2. 高精度测量:传感器采用先进的电磁感应技术,能够实现高精度的液位测量。 3. 可编程性:传感器支持多种工作模式和参数设置,可以根据实际需求进行灵活配置。 4. 易于安装和维护:传感器结构简单,安装方便,同时具有较高的可靠性和稳定性。 在使用STM32F103C8T6控制非接触液位传感器DR-01时,你可以通过以下步骤进行操作: 1. 连接硬件:将传感器与STM32F103C8T6进行连接,通常通过数字输入/输出引脚或模拟输入引脚进行数据传输。 2. 配置引脚:在STM32F103C8T6的开发环境中,配置相应的引脚为输入或输出模式,并设置相应的电平逻辑。 3. 初始化传感器:通过发送特定的指令或配置寄存器,初始化传感器的工作模式和参数。 4. 读取数据:使用STM32F103C8T6的相应接口读取传感器返回的数据,获取液位信息。 5. 处理数据:根据传感器返回的数据进行相应的处理和计算,得到最终的液位值。 6. 控制输出:根据液位值进行相应的控制操作,例如控制液位报警、液位控制等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值