电脑定时响_电脑系统滴答定时器
1.电脑测试卡 显示代码 8是什么意思
2.定时器的小妙用
3.STM32中,systick具体延时时间怎么计算的?
记住一点,STM32单片机的中断分两个,一个是内核中断,就是Cortex-M3引发的中断,另一种是外设引起的中断,比如串口,Can口,定时器等等。
所有外设引发的中断,都要软件清除相应的中断标志,而内核引发的中断,就不必要,硬件会自己清除的。
电脑测试卡 显示代码 8是什么意思
读者们,大家好!
接着上一章多功能时钟(绪论)的内容,在这一章中,我将介绍多功能时钟的时钟显示部分。话不多说,我们正式开始吧~
多功能时钟,时钟显示功能是必不可少的。所以,我们利用stm32的定时器来计时。本来打算采用stm32的RTC实时时钟,但后来想,刚开始弄得时候,尽量简单一些,别一开始就给自己出难题,毕竟RTC实时时钟要配置的东西还挺多的。如果此次做得不错的话,后面可以再加RTC实时时钟。
stm32不同于51,共有11个定时器,其中2个高级控制定时器(TIM1和TIM8),4个普通定时器(TIM2~TIM5)和2个基本定时器(TIM6和TIM7),以及2个看门狗定时器和1个系统滴答定时器。这里,我们采用普通定时器TIM2,并且开启定时器的中断,中断时间为1s,并且在中断函数里,模拟时钟的计时功能。
(1)配置嵌套中断控制器NVIC
void tim2_nvic_config(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级为2
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;//子优先级为0
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
这里,我们只需对NVIC_InitStruct结构体的每个元素赋值,其中TIM2_IRQn为定时器TIM2中断线,设置优先级组为2,即抢占优先级组为4组,这里抢占优先级为2,子优先级为0,然后使能NVIC(优先级不能理解上网查询)。
(2)定时器初始化配置
void tim2_config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
tim2_nvic_config(); //配置NVIC
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启时钟
TIM_DeInit(TIM2); ? //定时器2复位
TIM_TimeBaseInitStruct.TIM_Period = 2000-1; ? //自动重装载寄存器值
TIM_TimeBaseInitStruct.TIM_Prescaler = 36000-1; ? //时钟预分频数
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //采样分频
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct); //初始化TIM2
TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除溢出中断标志
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE); ? //使能时钟
}
TIM2初始化,首先配置NVIC,打开TIM2时钟,复位TIM2。然后对TIM_TimeBaseInitStruct结构体的每个元素赋值。这里,主要阐述如何计算定时中断时间。定时器的溢出中断时间由TIM_Period和TIM_Prescaler来决定的。这里,我直接给出公式:发生中断时间=(TIM_Period+1)*(TIM_Prescaler+1)/FCLK,而FCLK为72M,所以定时1s,可以这样:TIM_Period=2000-1,TIM_Prescaler=36000-1;最后清除溢出中断标志,使能时钟即可计时。
(3)编写中断计时函数
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2 ,TIM_IT_Update)!=RESET)
{
sec++;
if(sec>=60)
{
sec = 0;
min++;
if(min>=60)
{
min = 0;
hour++;
if(hour>=24)
{
hour = 0;
}
}
}
}
TIM_ClearITPendingBit(TIM2 ,TIM_FLAG_Update);
}
这里,先定义时、分、秒三个变量,然后在中断函数里,对时间变量的关系进行换算即可。
(4)编写时钟显示函数
这里,我们采用LCD12864实时显示。LCD12864的相关内容,我后面在LCD库函数章节中,会专门介绍的。这里,只将时间显示即可。
lcd_display_num_m(2, 16, hour/10);
lcd_display_num_m(2, 24, hour%10);
lcd_display_string(2,32,"时");
lcd_display_num_m(2, 48, min/10);
lcd_display_num_m(2, 56, min%10);
lcd_display_string(2,64,"分");
lcd_display_num_m(2, 80, sec/10);
lcd_display_num_m(2, 88, sec%10);
lcd_display_string(2,96,"秒");
LCD12864的驱动函数,我跟着黄老师的视频后面写的,在老师的基础上,增加了汉字字符串显示函数。这里,看成库函数即可,只需简单的调用,显示时间就行。
(5)按键调整时间
成功显示时间后,我们需要按键来调整时间。 我们需要设置时钟启/停键(K1),时间位选择键(K2),数值增加键(K3),数值减小键(K4)。
1.我们先对按键的GPIO进行配置,开启相应的时钟,选择相关引脚,设置浮空输入模式等。
void key_gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*使能GPIO的RCC时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
/*配置PB11~PB14引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
2.配置好按键的GPIO口后,编写按键扫描函数,从而达到调整时间的功能。
u8 flag,mark;//flag为定时器启停标志位,mark为位选择标志位
//mark为0表示未选中,mark为1表示选择时位,mark为2表示选择分位,mark为3表示选择秒位
void keyscan(void)
{
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==RESET)
{
delay_ms(10);
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==RESET)
{
flag = ~flag;
if(!flag)
{
TIM_Cmd(TIM2, ENABLE);
}
else
{
TIM_Cmd(TIM2, DISABLE);
mark = 0;
}
}while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==RESET);
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==RESET)
{
delay_ms(10);
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==RESET)
{
mark = mark>=3?0:mark+1;
}while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==RESET);
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==RESET)
{
delay_ms(10);
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==RESET)
{
if(flag)
{
switch(mark)
{
case 1:hour = hour<23?hour+1:0;break;
case 2:min = min<59?min+1:0;break;
case 3:sec = sec<59?sec+1:0;break;
default:break;
}
}
}while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==RESET);
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==RESET)
{
delay_ms(10);
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==RESET)
{
if(flag)
{
switch(mark)
{
case 1:hour = hour>0?hour-1:23;break;
case 2:min = min>0?min-1:59;break;
case 3:sec = sec>0?sec-1:59;break;
default:break;
}
}
}while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==RESET);
}
}
至此,我们完成了时钟显示的功能,当然,后期如果可以的话,我们可以使用stm32的RTC实时时钟资源,还可以设置闹钟、整点报时的功能。
本章,我主要介绍了如何利用stm32的TIM定时器和GPIO资源,实现时钟显示和按键调整的功能。下一章中,我将介绍如何利用DHT11模块来测量温度和湿度,从而实现系统对环境参量的获取。
定时器的小妙用
七、故障代码含义速查表
代码 Award AMI Phoenix/Tandy3000
00 1. 由一系列代码(不含“00”和“FF”)到“FF”或“00”,则主板自检已通过,OK。
2. 出“00”,且不变码,则为主板没有运行,查CPU坏否、CPU跳线、或CPU设置正确否、电源正常否、主板电池等处有否发霉?
3. 如果您在CMOS中设置为不提示错,则遇到非致命性故障时,诊断卡不会停下来而接着往后走一直到“00”,解决方法为更改CMOS设置为提示所有错误再开机,这时若有非致命故障则停住,再根据代码排错。 同左 同左
01 处理器测试1,处理器状态核实,如果测试失败,循环是无限的。试换CPU,查CPU跳线或CPU设置错否? 处理器寄存器的测试即将开始,非屏蔽中断即将停用。建议排除方法同左 CPU寄存器测试正在进行或者失灵。建议排除方法同左
02 确定诊断的类型(正常或者制造)。如果键盘缓冲器含有数据就会失效。试查主板中与键盘相关电路及键盘本身。 使用非屏蔽中断;通过延迟开始。查主板和CPU。 CMOS写入/读出正在进行或者失灵。试查主板电池等。
代码 Award AMI Phoenix/Tandy3000
03 清除8042键盘控制器,发出TEST-KBRD命令(AAH)。查键盘内部电路及软件。 通电延迟已完成 ROM BIOS检查部件正在进行或失灵。查主板BIOS芯片是否已插好或周边电路发霉。
04 使8042键盘控制器复位,核实TESTKBRD。查主板中键盘接口电路。 键盘控制器软复位/通电测试。查主板中的键盘控制部分的电路。 可编程间隔计时器的测试正在进行或失灵。查主板中与 定时器相关的电路。
05 如果不断重复制造测试1至5,可获得8042控制状态。查主板中键盘控制电路。 已确定软复位/通电;即将启动ROM.。查主板ROM芯片及其支持电路。 DMA初始页面寄存器读/写准备正在进行或失灵。查主板中与DMA有关的芯片及其外围电路。
06 使电路片作初始准备,停用视频、奇偶性、DMA电路片,以及清除DMA电路片,所有页面寄存器和CMOS寄存器的工作。查主板中与DMA相关的电路。 已启动ROM计算ROM BIOS 检查总和,以及检查键盘缓冲器是否清除。查主板RCM芯片及其支持电路。 DMA初始页面寄存器读/写测试正在进行或失灵。查主板中与DMA有关芯片及其外围电路。
07 处理器测试2,核实CPU寄存器的工作。查CPU是否插好,或CPU坏,或CPU跳线等设置有错否。 ROM BIOS检查总和正常,键盘缓冲器已清除,向键盘发出BAT(基本保证测试)命令。查主板中键盘接口电路或试更换键盘。
08 使CMOS计时器作初始准备,正常地更新计时器的循环。查主板中CMOS电路及芯片。 已向键盘发出BAT命令,即将写入BAT命令。查主板键盘控制电路及键盘本身 RAM更新检验正在进行或失灵。查主板的内存接口电路及内存槽和内存条。
代码 Award AMI Phoenix/Tandy3000
09 EPROM检查总和且必须等于零才通过。查主板的BIOS电路及芯片。 核实键盘的基本保证测试,接着核实键盘命令字节。查主板的键盘插座及试换键盘。 第一个64K RAM测试正在进行。查找方法同上。
0A 使视频接口作初始准备。查与显卡有关的电路。 发出键盘命令字节代码,即将写入命令字节数据。试换键盘。 第一个64K RAM芯片或数据线失灵,移位。同上。
0B 测试8254芯片的DMA通道0。查主板中键盘控制电路及键盘中的控制电路。 写入键盘控制器命令字节,即将发出引脚23和24的封锁/解锁命令。查键盘控制器电路。 第一个64K RAM的奇/偶逻辑失灵。同上。
0C 测试8254通道1。查键盘中的控制电路。 键盘控制器引脚23,24已屏蔽/解锁;已发出NOP命令。试换键盘。 第一个64K RAM的地址线故障。同上。
0D 1、检查CPU速度是否与系统时钟匹配。查CPU跳级及CMOS中关于CPU参数的设置。2、检查控制芯片已编程值是否符合初设置。3、视频通道测试,如果失败,则鸣喇叭。 已处理NOP命令;接着测试CMOS停开寄存器。查主板中控制CMOS的相关电路。 第一个64K RAM的寄偶性失灵。同上。
0E 测试CMOS停机字节。查主板中CMOS芯片及电路。 CMOS状态寄存器读/写测试;将计算CMOS检查总和。查主板CMOS芯片及其支持电路和主板电池。 初始化输入输出端口地址。查主板中与I/O相关的芯片及其外围电路,并注意插入的扩展卡等外部设备的I/O地址是否有冲突。
代码 Award AMI Phoenix/Tandy3000
0F 测试扩展的CMOS。 已计算CMOS检查总和写入诊断字节;CMOS开始初始准备。查主板电池及CMOS芯片。
10 测试DMA通道0。查主板中DMA芯片及电路。 CMOS已作初始准备,CMOS状态寄存器即将为日期和时间作初始准备。查主板中CMOS控制电路。 第一个64K RAM第0位故障。查主板中内存管理电路及内存槽有否生锈?有杂物否?内存条坏否?
11 测试DMA通道1。查主板中DMA芯片及该芯片周边电路。 CMOS状态寄存器已作初始准备,即将停用DMA和中断控制器。查主板中与DMA和中断控制器有关芯片及其外围电路。 第一个64K RAM第1位故障。同代码10。
12 测试DMA页面寄存器。查主板中DMA芯片及该芯片的周边电路。 停用DMA控制器1以及中断控制器1和2;即将视频显示器并使端口B作初始准备。查主板或显卡中视频接口电路。 第一个64K RAM第2位故障。同代码10。
13 测试8741键盘控制器接口。查主板中键盘接口电路。 视频显示器已停用,端口B已作初始准备;即将开始电路片初始化/存储器自动检测。查显卡中控制芯片、显存芯片及其外围电路。 第一个64K RAM第3位故障。同代码10。
代码 Award AMI Phoenix/Tandy3000
14 测试8254计时器0。查主板中的计时器电路。 电路片初始化/存储器自动检测结束;8254计时器测试即将开始。查主板中8254或与计时器有关的芯片及其支持电路。 第一个64K RAM第4位故障。同代码10。
15 测8259中断屏蔽位。查主板中的8259芯片及其周边电路。 第2通道计时器测试了一半;8254第2通道计时器即将完成测试。查主板中计时器电路部分。 第一个64K RAM第5位故障。同代码10。
16 建立8259所用的中断矢量表。查主板中8259芯片及其周围电路。 第2通道计时器测试结束;8254第1通道计时器即将完成测试。查主板中计时器芯片及其外围。 第一个64K RAM第6位故障。同代码10。
17 调准视频输入/输出工作,若装有视频BIOS则启用。查显卡及主板中与显卡有关的控制电路。 第1通道计时器测试结束;8254第0通道计时器即将完成测试。查主板中计时器电路。 第一个64K RAM第7位故障。同代码10。
18 测试视频存储器,如果安装选用的视频BIOS通过本项测试,则可绕过。查显卡中的BIOS芯片及其周围电路。 第0通道计时器测试结束;即将开始更新存储器。查主板中内存管理电路,内存槽及内存条。 第一个64K RAM第8位故障。同代码10。
19 测试第1通道的中断控制器(8259)屏蔽位。查主板中的8259芯片。 已开始更新存储器。 第一个64K RAM第9位故障。同代码10。
代码 Award AMI Phoenix/Tandy3000
1A 测试第2通道的中断控制器(8259)屏蔽位。查主板中的8259芯片。 正在触发存储器更新线路,即将检查15微秒通/断时间。查主板内存芯片及其接口电路。 第一个64K RAM第10位故障。同代码10。
1B 测试CMOS电池电平。查主板中电池有电否,有些板的电池装在CMOS模块里面,可拆下上盖更换电池。 完成存储器更新时间30微秒测试;即将开始基本的64K存储器测试。查主板内存控制部分及内存槽和内存条。 第一个64K RAM第11位故障。同代码10。
1C 测试CMOS检查总和。查主板中CMOS芯片及其电路。 第一个64K RAM第12位故障。同代码10。
1D 调定CMOS的配置。查主板中CMOS芯片。 第一个64K RAM第13位故障。同代码10。
1E 测定系统存储器的大小,并且把它和CMOS值比较。查主板中的CMOS电路及主板中的内存。 第一个64K RAM第14位故障。同代码10。
1F 测试64K存储器至最高640K。查主板中的内存条或内存芯片。 第一个64K RAM第15位故障。同代码10。
20 测量固定的8259中断位。查主板中8259芯片及周边电路。 开始基本的64K存储器测试;即将测试地址线。查主板中内存接口及内存槽和内存条。 从属DMA寄存器测试正在进行或失灵。查主板中包含有DMA的芯片及其支持电路。
21 维持不可屏蔽中断(NMI)位(奇偶性或输入/输出通道的检查)。查主板中中断控制器芯片及其外围电路。 通过地址线测试;即将触发奇偶性。查主板中与内存奇偶位相关的数据线电路。 主DMA寄存器测试正在进行或失灵。同上。
代码 Award AMI Phoenix/Tandy3000
22 测试8259的中断功能。查主板中8259芯片及其周围电路。 结束触奇偶性;将开始串行数据读/写测试。查主板中与内存控制部份和内存条、槽。 主中断屏蔽寄存器测试正在进行或失灵。查主板中与中断控制器有关的芯片及其外围电路。
23 测试保护方式;虚拟方式和页面方式。查主板内存芯片及其周围电路。 基本的64K串行数据读/写测试正常;即将开始中断矢量初始化之前的任何调节。查主板中断控制器及与中断矢量有关的存储器部分。 从属中断屏蔽寄存器测试正在进行或失灵。查主板中与中断控制器有关的芯片及其外围电路。
24 测定1Mb以上的扩展存储器。查内存。 矢量初始化之前的任何调节完成,即将开始中断矢量的初始准备。查主板中断控制器部份。 设置ES段地址寄存器注册表到内存高端。查主板中与内存管理接口电路有关的芯片及其支持电路和内存条。
25 测试除头一个64K之后的所有存储器。查内存。 完成中断矢量初始准备;将为旋转式继续开始读出8042的输入/输出端口。查主板中8042芯片及其外围。 装入中断矢量正在进行或失灵。查主板的内存控制电路及其内存槽和内存条。
26 1. 测试保护方式的例外情况。查CPU及主板中的内存等。
2. 无致命性故障,VGA显示正常,若有非致命性故障则在VGA显示屏中显示其错误信息,否则引导操作系统,此时“26”既为“OK”码,诊断卡再也没有其它代码可显。 1. 读写8042的输入/输出端口;即将为旋转式继续开始使全局数据作初始准备。查主板中8042芯片部分。
2. 同左 1. 开启A20地址线使之参入寻址。查主板中内存管理芯片A20引脚及其引脚的相关联的电路和内存槽中A20弹片是否接触不上内存条的金手指或内存条A20脚功能坏。
2. 同左
代码 Award AMI Phoenix/Tandy3000
27 测定超高速缓冲存储器的控制或屏蔽RAM。查主板中的Cache控制电路及内存条。 全1数据初始准备结束;接着将进行中断矢量之后的任何初始准备。查主板中断控制器部分。 键盘控制器测试正在进行或失灵。查主板中键盘接口电路。
28 测定超高速缓冲存储器的控制或者特别的8242键盘控制器。查主板Cache控制及主板中键盘控制电路。 完成中断矢量之后的初始准备;即将调定单色方式。查显卡接口部分。 CMOS电源故障/检查总和计算正在进行。查主板中CMOS芯片及其关联电路和主板中电流供电通路部份,试更换电源。
29 已调定单色方式,即将调定彩色方式。查彩显卡。 CMOS配置有效性的检查正在进行。查主板中CMOS写入电路。
2A 使键盘控制器作初始准备。查主板中的键盘控制器电路。 已调定彩色方式,即将进行ROM测试前的触发奇偶性。查显卡BIOS芯片及支持电路。 置空64K基本内存。查主板中内存接口电路和内存槽及内存条。
2B 使软盘驱动器和控制器作初始准备。查主板中的软驱控制电路及软驱本身有否问题和多功能卡等。 触发奇偶性结束;即将控制任选的视频ROM检查前所需的任何调节。查显卡ROM及其周边电路。 屏幕存储器测试正在进行或者失灵。查主板或显卡中的显存接口电路及显存芯片。
2C 检查串行端口,并使之作初始准备。查主板中的串口控制电路和多功能卡的串口电路。 完成视频ROM控制之前的处理;即将杳看任选的视频ROM并加以控制。查显卡ROM芯片及相关电路。 屏幕初始准备正在进行或失灵。查显卡接口电路。
代码 Award AMI Phoenix/Tandy3000
2D 检查并行端口,并使之作初始准备。查主板中或多功能卡中的并行口的控制电路。 已完成任选的视频ROM控制,即将进行视频ROM回复控制之后任何其他处理的控制。查显卡BIOS芯片及外围电路。 屏幕回扫测试正在进行或失灵。查显卡ROM芯片及其控制电路。
2E 使硬盘驱动器和控制器作初始准备。查主板中或多功能卡中的控制电路或硬盘本身。 从视频ROM控制之后的处理复原;如果没发现EGA/VGA就要进行显示器存储器读/写测试。查显卡中的显存及外围电路。 检查视频ROM正在进行。查显卡ROM芯片及其控制电路。
2F 检测数学协处理器,并使之作初始准备。查主板中的数学处理器(486DX以上CPU与数学处理器是合为一体的) 没发现EGA/VGA;即将开始显示器存储器读/写测试。查显卡中的显存片及周边电路。
30 建立基本内存和扩展内存。查主板中的内存槽及内存控制电路和内存条本身。 通过显示器存储读/写测试;即将进行扫描检查。查显卡视频接口电路。 认为屏幕是可以工作的。
31 检测从C800:0至EFFF:0的选用ROM,并使之作初始准备。查主板中的ROM存储器及其控制电路。 显示器存储器读/写测试或扫描检查失败,即将进行另一种显示器存储器读/写测试。查显卡中显存芯片及其外围电路。 单色监视器是可以工作的。
代码 Award AMI Phoenix/Tandy3000
32 对主板上COM/LPT/FDD/声音设备等I/O芯片编程使之适合设置值。查主板中类似多功能卡的部份电路,老主板则试换一块多功能卡。 通过另一种显示器存储器读/写测试;即将进行另一种显示器扫描检查。查显卡中视频接口电路。 彩色监视器(40列)是可以工作的。
33 视频显示器检查结束;将开始利用调节开关和实际插卡检验显示器的类型。查显卡中视频控制电路。 彩色监视器(80列)是可以工作的。
34 已检验显示适配器;接着将调定显示方式。试换显示卡。 计时器滴答声中断测试正在进行或失灵。查主板中中断控制器及计时器电路。
35 完成调定显示方式;即将检查BIOS ROM的数据区。查显卡中BIOS芯片及外围。 停机测试正在进行或失灵。查主板中BIOS或试换CPU。
36 已检查BIOS ROM数据区;即将调定通电信息的游标。查显卡或试换显卡。 门电路中A-20失灵。查找方法同代码“26”(见 页)
37 识别通电信息的游标调定已完成;即将显示通电信息。试换显卡。 保护方式中的意外中断。
代码 Award AMI Phoenix/Tandy3000
38 完成显示通电信息;即将读出新的游标位置。试换显卡。 RAM测试正在进行或者地址故障>FFFFh。查主板中内存接口电路及内存槽和内存条。
39 已读出保存游标位置,即将显示引用信息串。试换显卡。
3A 引用信息串显示结束;即将显示发现<ESC>信息。试换显卡。 间隔计时器通道2测试或失灵。查主板中与定时计数器相关的部份。
3B 用OPTI电路片(只是486)使辅助超高速缓冲存储器作初始准备。查主板中OPTI及高速缓存芯片及电路。 已显示发现<ESC>信息;虚拟方式,存储器测试即将开始。查显卡中ROM部分。 按日计算的日历时钟测试正在进行或失灵。查主板中CMOS及计时电路。
3C 建立允许进入CMOS设置的标志。查主板中的RAM电路及CMOS电路。 串行端口测试正在进行或失灵。查主板或多功能卡中COM口的接口电源。
3D 初始化键盘/PS2鼠标/PNP设备及总内存节点。查键盘、鼠标、即插即用部件等。 并行端口测试正在进行或失灵。查主板或多功能卡中LPT口的接口电路。
代码 Award AMI Phoenix/Tandy3000
3E 尝试打开L2高速缓存。查主板中的Cache及相关控制电路。 数学处理器测试正在进行或失灵。低于486DX则试换数学处理器及查主板中与数学处理器接口电路及插座等,486DX以上则试更换CPU及查主板中CPU座,CPU电源频率跳线等设置。
40 已开始准备虚拟方式的测试;即将从视频存储器来检验。查显卡。 调整CPU速度,使之与外围时钟精确匹配。查主板的主频振荡定时计数器部份或试换CPU或试将CPU降频。
41 中断已打开,将初始化数据以便于0:0检测内存变换。查中断控制器或内存。 从视频存储器检验之后复原;即将准备描述符表。查显卡。 系统插件板选择失灵。查主板中与该插件板的接口部份。
42 显示窗口进入SETUP。 描述符表已准备好;即将进行虚拟方式作存储器测试。查内存部分。 扩展CMOS RAM故障。查主板中CMOS RAM芯片及其外围电路。
43 若是即插即用BIOS,则串口、并口初始化。查主板的串口,并口控制电路。 进入虚拟方式;即将为诊断方式实现中断;查内存部分。
44 已实现中断(如已接通诊断开关);即将使数据作初始准备以检查存储器在0:0返转。查内存部分。 BIOS中断进行初始化。查主板中断控制器部份。
45 初始化数学处理器。是486DX以上则换CPU,否则查数学处理器。 数据已作初始准备;即将检查存储器在0:0返转以及找出系统存储器的规模。查内存部分。
代码 Award AMI Phoenix/Tandy3000
46 测试存储器已返回;存储器大小计算完毕,即半写入页面来测试存储器。查内存部分。 检查只读存储器ROM版本。查主板中BIOS芯片及其支持电路。
47 即将在扩展的存储器试写页面;即将基本640K存储器写入页面。查内存部分。
48 已将基本存储器试写入页面;即将确定1Mb以上的存储器。查内存部分。 视频检查,CMOS重新配置。查主板或显卡中的视频接口部件及主板中CMOS芯片及其外围电路。
49 找出1Mb以下的存储器并检验,即将确定1Mb以上的存储器。查内存部分。
4A 找出1Mb以上的存储器并检验;即将检查BIOS ROM的数据区。查内存部分。 进行视频的初始化。查主板或显卡中的视频接口部份。
4B BIOS ROM数据区的检验结束,即将检查<ESC>和为软复位清除1Mb以上的存储器。查内存部分。
4C 清除1Mb以上的存储器(软复位)即将清除1Mb以上的存储器。查内存部分。 屏蔽视频BIOS ROM。查主板或显卡中BIOS ROM芯片及其支持电路。
4D 已清除1Mb以上的存储器(软复位);将保存存储器的大小。查内存部分。
代码 Award AMI Phoenix/Tandy3000
4E 若检测到有错误,在显示器上显示错误信息,并等待客户按(F1)键继续。属非致命性故障,请根据屏幕提示排错。 开始存储器的测试:(无软复位);即将显示第一个64K存储器的测试。查内存部分。 显示版权信息。查主板或显卡的RAM芯片及支持电路或当“死机”排查。
4F 如果没有密码则等待输入密码,请输入正确的密码,如果忘记了密码请参见第 页《忘了口令怎么办》解决。 开始显示存储器的大小,正在测试存储器将使之更新;将进行串行和随机的存储器测试。查内存部分。
我的回复太长无法都显示出来!~我在给你发个消息把 给分
STM32中,systick具体延时时间怎么计算的?
定时器这个东西,其实我也不知道为什么要买,反正就是稀里糊涂的买回来了,昨天下午刚到货,研究好用法之后,没想到在晚上女儿写作业的时候就用上了。
昨天因为我工作忙,自己在书房工作,让女儿自己写作业,结果过了差不多20分钟吧,她跑进来找我玩,我还以为她已经写完作业了,过去一看,我的天,才写了几个字母,突然,我想到了下午刚刚收到的定时器,女儿也看到了,并且很喜欢,我把定时器设定了半个小时,我跟女儿说现在开始安安静静的写作业,并且要在半个小时内写完,女儿答应了。平时女儿写作业的时候,我也跟她说过这样的话,可是她总是写着写着就开始玩,或者边写边唱歌,可是当定时器滴答声响起的时刻,她立马拿起笔写作业,而且全程没有说过一句话,直到作业写完拿给我看,时间也才过了20分钟,哈哈哈,我觉得自己发现了定时器的新用法,以后可以用这个小东西来和女儿做时间约定了,比如看电视的时间,玩的时间,看书的时间等等。
如果你家里有小朋友,其实不妨试一试这个办法,小朋友其实在某些方面是很守约的,比如晚上睡觉前,我跟女儿约好看完一集动画片就要去洗脸刷牙,然后我就去忙自己的事情,当动画片播完以后,她就会自己关掉电视去洗脸刷牙,只不过她对时间长度的概念不是很清楚,有了这个定时器,就可以轻松解决这一问题哦。
哈哈哈你太有福气了,刚研究出来的,感觉好就给个好评
/****************************************************************************
* STM32单片机SysTick系统滴答定时器实验程序
*
*
*
*****************************************************************************/
#ifndef _SYSTICK_H
#define _SYSTICK_H
#include "SysTick.h"
#define SYSTICK_CSR (*((volatile unsigned long *) 0xE000E010))//控制寄存器
#define SYSTICK_LOAD (*((volatile unsigned long *) 0xE000E014))//重载寄存器
#define SYSTICK_VAL (*((volatile unsigned long *) 0xE000E018))//当前值寄存器
#define SYSTICK_CALRB (*((volatile unsigned long *) 0xE000E01C)) //校准值寄存器
unsigned long SysTick_Delay;//全局变量
//配置寄存器
void SysTick_InitStructReadCmd(void)
{
SYSTICK_VAL = 0; //当前值寄存器清零
SYSTICK_LOAD = SystemCoreClock / 1000000; //重要部分就在这里 系统72000000 / 100000
SYSTICK_CSR |= 0x06; //先关闭SysTick使能用的时候在打开
}
//中断服务程序
void SysTick_Hangler(void)
{
SYSTICK_VAL = 0; //当前值寄存器清零
if(SysTick_Delay != 0x00)//判断延时SysTick_Delay 是否等于0
{
SysTick_Delay--;//减到0结束
}
}
//延时函数
void Delay_10us(unsigned long Countlinef)
{
SYSTICK_CSR |= 0x07; //启动SysTick使能
SysTick_Delay = Countlinef; //把延时变量赋值SysTick_Delay全局变量
while(SysTick_Delay != 0); //判断延时时间是否到
SYSTICK_CSR |= 0x06; //时间到关闭 SysTick使能用的时候在打开
}
int main(void)
{
SystemInit(); //注意这么是把系统时钟设初始化为 72M主频,这里是必须的
SysTick_InitStructReadCmd();
while(1)
{
GPIOD->BSRR = 0x00000100;
Delay_10us(1000000) ; //实现1ms延时
GPIOD->BRR = 0x00000100;
}
}
//====================================END=============================================//
/* 好了我们开始讲解程序1us是怎么实现的,我们使用时钟源为APB时钟,APB系统频率陪配置为72MHZ
SYSTICK_LOAD = SystemCoreClock / 1000000; SysTick重载初值重要的地方就在这里
1:SystemCoreClock 这个是什么意思,跟踪库函数找到如下:
#ifdef SYSCLK_FREQ_HSE
uint32_t SystemCoreClock = SYSCLK_FREQ_HSE;
#elif defined SYSCLK_FREQ_24MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz;
#elif defined SYSCLK_FREQ_36MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz;
#elif defined SYSCLK_FREQ_48MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz;
#elif defined SYSCLK_FREQ_56MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz;
#elif defined SYSCLK_FREQ_72MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz;
#else /*!< HSI Selected as System Clock source */
// uint32_t SystemCoreClock = HSI_VALUE;
/*这里不难看出,我们初始化SystemInit(); 是系统已经把SystemCoreClock配置成72M下面就不难理解了,
先看一下计算公式:T = TICKS * (1/f);
T : 为要计时的总时间。
TICKS :为SYSTICK_LOAD 的输入参数。
(1/f)为使用时钟源的时钟周期,f为时钟源的时钟频率
使用时钟源为AHB时钟, 频率被配置72M;
把SYSTICK_LOAD重载寄存器赋值为 SystemCoreClock / 1000000;呵呵呵大家
发现了什么,就是72000000 / 1000000 = 72;大家都应该知道了72个时钟周期
中断一次,大家接着看(1/f)是时钟周期的时间。1/72M = 0.13888888888888888888888888888889;
1us诞生了,0.13888888888888888888888888888889*72 = 1;1us哈哈哈大家明白了吧。
//野火资料出问题的地方 ticks=SystemFrequency / 10 000 =720,相当于:72000000 / 10000 ;这里少了一个0 结果等于 = 7200 不等于720看资料看的纠结哈哈哈。
这个程序折磨我1个星期,没有吃好睡好,搞明白后我就马上做上笔记那给大家分享。
*/
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。