嵌入式arm(五)裸机编程之简单的使用{看门狗}{PWM}{ADC}快速练习

本文介绍了在ARM Cortex-A9架构的Exynos4412开发板上进行裸机编程的经验,涉及看门狗定时器、PWM驱动无源蜂鸣器和ADC的简单使用。通过查看硬件电路、理解寄存器配置以及编写相关程序,展示了如何利用看门狗防止程序异常,使用PWM产生PWM波形驱动蜂鸣器,以及通过ADC读取电位器电压。
摘要由CSDN通过智能技术生成

使用开发板:FS4412,Soc:Exynos4412,内核型号:cortex-A9,架构:armv7;
文档:开发板原理图,Soc数据手册;
环境:文件编写及编译:Linux;下载程序:超级终端hypertrm;串口下载
编译器:交叉编译器arm

一 看门狗定时器

1 什么是看门狗定时器

1.1 看门狗是啥?

要是按着教科书上的来学的话,里面的概念就够我们吃一天了,做开发就讲究一个短平快,不要整那些没用的,你把课本上概念默写了就能把代码写出来?正经人谁还看教材啊。
还有,别整喂狗那套,本来学习就够繁琐,还要想狗那套,还要联系到定时器上,累不累啊。
看门狗就是一个定时器,你设定一个时间,时间到了看门狗执行复位,就这么简单;

1.2 看门狗有什么用?

(1) 到时间就复位,这不是捣乱吗?不行!
哎,我在时间到之前把定时器的值给改了,不就到不了触发复位的条件了,好。
(2) 怎么改?
我在时间到之前把定时器改成初始值,即让它重新开始计时,我还周期性地改,让这个定时器一直计时,但是一直都到不了设定的时间,也就一直不会复位。
(3) 到底实现了什么功能:防止程序异常跑飞;
跑飞:就是程序不知道跑到哪里去了,不受控制,不做任何相应,卡死也是一种跑飞;
(4) 对于那些在没有人监控的条件下运行的程序,无法知道什么时候可能会异常,不能及时地去复位它;现在有了看门狗,设定一个时间让它计时;在用户代码中周期性地把它的计数值复原,阻止其复位程序;当用户程序异常跑飞,脱离了用户程序的看门狗计时器到达设定值就把程序复位,让其恢复正常运行状态;
(5) 所以说,看门狗的到点复位,在程序正常运行时是毒瘤,在程序跑飞时是救星;

2 看门狗的使用

2.1 查硬件电路

看门狗定时器是soc的内部外设,工作时不需要用到引脚:
在这里插入图片描述

2.2 查寄存器

在这里插入图片描述
在这里插入图片描述
如图,8-15位设置第一辑分频,3-4位选择第二级分频,第5位控制看门狗的开启与关闭,第2位控制是否中断,第0位设置到达时间是否复位,也就是说,既可以选择到时间中断也可以选择到时间重启,本次我们只选重启;
在这里插入图片描述
第0-15位设置计数器最大值,由第一张框图可以看出,这里的wdt是递减型计时器;

2.3 编程

下图的程序中,开启了看门狗但是没用复原操作,只放了流水灯,现象为到达设定时间后程序复位,由于程序是烧录到内存中的,所以直接复位导致程序丢失;流水灯全灭无现象;

/* main.c */
#include "led.h"
#include "wdt.h"
void init()
{
   
	led_init();
	wdt_init();
}
int main()
{
   
	init();
	while(1)
	{
   
		streamled();//流水灯;
	}
	return 0;
}

下图的主程序中加入了复原操作,程序不再复位,流水灯一直运转;

/* main.c */
#include "led.h"
#include "wdt.h"
void init()
{
   
	led_init();
	wdt_init();
}
int main()
{
   
	init();
	while(1)
	{
   
		streamled();
		delay();
		delay();
		delay();
		wdt_re;//复原操作
	}
	return 0;
}
/* wdt.c */
#include "wdt.h"

void wdt_init()
{
   
	//设置一级250分频,
	WTCON&=~(0xff<<8);
	WTCON|= (249 <<8);
	//设置二级128分频;
	WTCON&=~(0x3<<3);
	WTCON|= (0x3<<3);
	//分频后频率为3125hz;计数器值为15625,即定时5s;
	//设置计时器初值;
	wdt_re;
	//使能reset
	WTCON|=1;
	//开启
	WTCON|=1<<5;
}
/* wdt.h */
#ifndef _WDT_H_
#define _WDT_H_

#define uint unsigned int
#define<
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值