垂柳工作室
发表于 2024-2-14 13:02:51
我就闹不清楚该怎么查看芯片手册,心里没有谱,不知道要查哪些寄存器,从哪儿找到查找指引
JimOrange
发表于 2024-2-15 08:05:16
垂柳工作室 发表于 2024-2-14 13:02
我就闹不清楚该怎么查看芯片手册,心里没有谱,不知道要查哪些寄存器,从哪儿找到查找指引 ...
初学单片机都会有的疑惑,只能用到哪个功能再找找对应的寄存器,基本上都有功能都会有对应的寄存器管理。
垂柳工作室
发表于 2024-2-15 12:20:03
谢谢33楼的鼓励
JimOrange
发表于 2024-2-16 00:15:22
本帖最后由 JimOrange 于 2024-2-17 07:08 编辑
第十六集:IO中断。太好了{:4_245:},之前我以为只有固定的几个按钮来实现按键的中断,原来STC支持普通的I/O中断。
端口中断模式寄存器PxIM1, PxIM0, 其中:
M1 M0
0 0 (下降沿中断)STC32G系统都不支持
0 1 (上升沿中断)STC32G系统都不支持
1 0 (低电平中断)
1 1 (高电平中断)
PxINTE: 端口中断使能(enable)寄存器、PxINTF:端口中断标志(flag)寄存器, 0为没有请求,1为有请求
通过工具,可以扩展中断源编号,其中引脚的序号已经规定好,不能乱用。
中断源优先级:先执行高优先级,如果同一优先级,先执行次序高的。
垂柳工作室
发表于 2024-2-16 08:49:18
今天温习第30集iic总线
jackfangxq
发表于 2024-2-16 09:08:06
支持学习,共同进步。
JimOrange
发表于 2024-2-16 17:17:45
jackfangxq 发表于 2024-2-16 09:08
支持学习,共同进步。
谢谢~ 共同进步{:4_245:}
JimOrange
发表于 2024-2-16 17:44:43
垂柳工作室 发表于 2024-2-16 08:49
今天温习第30集iic总线
{:4_250:}这么快,你是不是已经学完了一遍{:4_245:}
JimOrange
发表于 2024-2-17 07:09:10
本帖最后由 JimOrange 于 2024-2-29 21:49 编辑
第十七集:模数转换器ADC。STC提供12位高速A/D转化器。使用ADC功能时,vref引脚千万不能悬空,一定要接到外部参考电压或者VCC上。
ADC_CONTR: ADC控制寄存器,其中有5个标志位,如下:
ADC_POWER: 0为关闭ADC电源,1为打开ADC电源
ADC_START: ADC启动位,需要ADC检查时,设置为1,完成后自动清零,手动清零不影响正在检测。
ADC_FLAG: ADC结束标志位。当完成ADC,硬件会置1,需要软件(手动)清零。
ADC_CHS: 能使用ADC功能的引脚只有15个,分别:P1.0~P1.7(其中没有P1.2,用P5.4代替), P0.0~P0.6, 其中ADC_CHS:1111标志位为测试电压1.19V占用。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ADCCFG: ADC配置寄存器, 其中标志位RESFMT:ADC转换结果格式,0为左对齐,1为右对齐;标志位SPEED:设置ADC时钟(0000~1111)+ 1 ###FADC = SYSclk / 2 / (SPEED + 1)。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ADCTIM: ADC时序控制寄存器,其中标志位CSSETUP:ADC通道选择时间控制,0为默认一个时钟,1为两个时钟;CSHOLD:ADC通道保持时间控制;SMPDUTY:ADC模拟信号采集控制,注意不能小于01010(时钟数为11)
12ADC转换速度 = SYSclk / 2 / (SPEED + 1) / [ (CSSETUP + 1) + (CMPDUTY + 1) + (CSHOLD + 1) + 12]
2的12次方为4096.
高精度ADC参考线路图,用到的TL431(2.5V基准电压源),与一般精度ADC区别:
1.verf引脚接到2.5V,一般精度接到VCC;
2.原因:因为VCC有可能连接多个用电器,导致电压不稳。(高精度测试电压必须<= 2.5V)
ADC_RES: ADC转换结果寄存器。
示例代码:
///////////////////////////////////////////////////////
ADCTIM = 0x3f; //设置ADC内部时序,0 0 1 1 1 1 1 1
//ADCTIM: ADC时序控制寄存器,
//其中标志位CSSETUP:ADC通道选择时间控制,0为默认一个时钟,1为两个时钟;
//CSHOLD:ADC通道保持时间控制;
//SMPDUTY:ADC模拟信号采集控制,注意不能小于01010(时钟数为11),这里设置为11111,也就是32 (31 + 1), 1(00000)
ADCCFG = 0x2f; //设置ADC时钟为:系统时钟2/16 , 0010 1111
//ADCCFG: ADC配置寄存器, --x-1111
//其中标志位RESFMT:ADC转换结果格式,0为左对齐,1为右对齐;
//标志位SPEED:设置ADC时钟(0000~1111)+ 1
//FADC = SYSclk / 2 / (SPEED + 1)。
ADC_POWER = 1; //使能ADC
float ADC_Read(u8 No) //指定通道,返回12位ADC数值
{
float res;
ADC_CONTR &= 0xf0; //清空低四位
ADC_CONTR |= No; //低四位,ADC_CHS,对应15个ADC通道
ADC_START = 1; //启动ADC转换
_nop_(); //等待1个时钟
_nop_();
while (!ADC_FLAG);//查询ADC完成标志,等待ADC转换结束
ADC_FLAG = 0; //清空ADC完成标志
res = (ADC_RES << 8) + ADC_RESL;
return res / 4096 * 2.5;
}
while (1)
{
printf("当前ADC值:%0.2f\r", ADC_Read(0)); //对应P1.0通道
delay_ms(500);
}
JimOrange
发表于 2024-2-18 22:26:00
本帖最后由 JimOrange 于 2024-3-1 22:34 编辑
第十八集:先占楼。