8254(可编程的硬件定时):使用8254定时产生的电平变换输入到STM32实现定时。这里有人就问了,STM32不是自带定时吗?为啥不用? 。。。。呃呃呃,这就说到我们学校的实验用哪个开发箱用汇编做的交通灯。做的不咋好就用STM32试试,所以就成这样了。主要练的线有:
/* 设置
PA.0 为 A0
PA.1 为 A1
PA.6 为 CLK0 //STM32提供200HZ方波
PB.0 为 RD
PB.1 为 WR
*/
void Set_Lca(uchar location) // 选择8254,8255地址线A0 A1
{
switch(location)
{
case 0:
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //写入计数器0 ||选择A口
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
break;
case 1:
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //写入计数器1 ||选择B口
GPIO_SetBits(GPIOA,GPIO_Pin_0);
break;
case 2:
GPIO_SetBits(GPIOA,GPIO_Pin_1); //写入计数器2 ||选择C口
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
break;
case 3:
GPIO_SetBits(GPIOA,GPIO_Pin_1); //写入控制寄存器
GPIO_SetBits(GPIOA,GPIO_Pin_0);
break;
default:
break;
}
}
/*向8254写入数据,data:数据 location:有4个选项(0:计数器0 1:计数器1: 2:计数器2 3:控制寄存器)*/
void Write_8254Data(uchar data,uchar location)
{
Set_Cs(1);
Set_Lca(location);
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
GPIO_SetBits(GPIOB,GPIO_Pin_0);
Ser_to_Pra(data);
GPIO_SetBits(GPIOB,GPIO_Pin_1);
Set_Cs(0);
}