datasheet

Tiny210裸机PWM控制蜂鸣器

2018-10-12来源: eefocus 关键字:Tiny210裸机  PWM控制  蜂鸣器

start.S源码:

.global _start

_start:

    ldr sp, =0xD0030000  // 初始化栈,因为后面要调用C函数 

    bl clock_init                // 初始化时钟 

    bl ddr_init                   // 初始化内存 

    bl nand_init                // 初始化NAND 

    ldr r0, =0x36000000  // 要拷贝到DDR中的位置 

    ldr r1, =0x0                // 从NAND的0地址开始拷贝 

    ldr r2, =bss_start       // BSS段的开始地址 

    sub r2,r2,r0                // 要拷贝的大小 

    bl nand_read            // 拷贝数据 

clean_bss:

    ldr r0, =bss_start

    ldr r1, =bss_end

    mov r3, #0

    cmp r0, r1

    ldreq pc, =on_ddr

clean_loop:

    str r3, [r0], #4

    cmp r0, r1    

    bne clean_loop        

    ldr pc, =on_ddr

on_ddr:

    ldr sp, =0x3f000000    // 重新初始化栈,指向内存 

    ldr pc, =main

=====================================================================

timer.c源码:

#define    GPD0CON     (*(volatile unsigned int *)0xE02000A0) 

#define    TCFG0           (*(volatile unsigned int *)0xE2500000) 

#define    TCFG1           (*(volatile unsigned int *)0xE2500004) 

#define    TCON            (*(volatile unsigned int *)0xE2500008) 

#define    TCNTB0         (*(volatile unsigned int *)0xE250000C) 

#define    TCMPB0        (*(volatile unsigned int *)0xE2500010) 

#define    TCNTO0        (*(volatile unsigned int *)0xE2500014) 

void pwm_init(void)

{

    // 配置为GPD0_0用于PWM输出 

    GPD0CON |= (0x2 << 0);     // TOUT_0 

}

void timer0_init(void)

{

    // 设置时钟源

    // Timer0 input clock Frequency = 66700000 / ( {prescaler + 1} ) / {divider value} 

    //      = 66700000 / (1+1) / 1

    //      = 33350000( 即1s计数33350000次 )

    TCFG0 &= ~(0xff);

    TCFG0  |= 1;        // Prescaler = 1 

    TCFG1  &= ~0xf;     // 0000 = 1/1 

    // 设置TCNTB0(即PWM的频率) 

    TCNTB0 = 33350;     // PWM的频率为1KHz  

                               

    // 设置TCMPB0(即PWM的占空比) 

    TCMPB0 = 16675;     // 占空比为50% 

    TCON &= ~(1<<2);    // 不进行电平反转(即引脚初始值为0) 

    TCON |= (1<<3);     // auto-reload 

}

void pwm_start(void)

{

    TCON |= (1<<1);   // set manual update 

    TCON |= (1<<0);   // start timer 0 

    TCON &= ~(1<<1);  // clean manual update 

}

void pwm_stop(void)

{

    TCON &= ~(1<<0);   // stop timer 0 

}

=====================================================================

command.c源码:

#include "lib.h"

#include "nand.h"

#include "timer.h"

int help(int argc, char * argv[])

{

    wy_printf("do_command 《%s》 \n", argv[0]);      //"《"实际为"<"

    wy_printf("help message: \n");

    wy_printf("md - memory dispaly\n");

    wy_printf("mw - memory write\n");

    wy_printf("nand read - nand read sdram_addr nand_addr size\n");

    wy_printf("nand write - nand write sdram_addr nand_addr size\n");

    wy_printf("pwm on - turn on buzzer \n");

    wy_printf("pwm off - turn off buzzer\n");

    return 0;

}

int md(int argc, char * argv[])

{    

    unsigned long *p = (unsigned long *)0;

    int i, j;

    wy_printf("do_command 《%s》 \n", argv[0]);

    if (argc <= 1) {

        wy_printf ("Usage:\n%s\n", "md address");

        return 1;

    }

    

    if (argc >= 2)

        p = (unsigned long *)atoi(argv[1]);

        

    for (j = 0; j < 16; j++)

    {    

        wy_printf("%x: ", p);

        for (i = 0; i < 4; i++)

            wy_printf("%x ", *p++);    

        wy_printf("\n");

    }

        

    return 0;

}

int mw(int argc, char * argv[])

{    

    unsigned long *p = (unsigned long *)0;

    int v = 0;

    wy_printf("do_command 《%s》 \n", argv[0]);//"《"实际为"<"

    if (argc <= 2) {

        wy_printf ("Usage:\n%s\n", "md address data");

        return 1;

    }

    

    if (argc >= 2)

        p = (unsigned long *)atoi(argv[1]);

        

    if (argc >= 3)

        v = atoi(argv[2]);

        

    *p = v;

    

    return 0;

}

int nand(int argc, char *argv[])

{

    int nand_addr, sdram_addr;

    unsigned int size;

    

    if (argc < 5)

    {

        wy_printf("nand read sdram_addr nand_addr size\n");

        wy_printf("nand write sdram_addr nand_addr size\n");

        return 0;

    }

    sdram_addr = atoi(argv[2]);

    nand_addr = atoi(argv[3]);

    size = atoi(argv[4]);

    wy_printf("do_command 《%s》 \n", argv[0]);

    wy_printf("sdram 0x%x, nand 0x%x, size 0x%x\n", sdram_addr, nand_addr, size);

    if (strcmp(argv[1], "read") == 0)

        nand_read((unsigned char *)sdram_addr, nand_addr, size);

    if (strcmp(argv[1], "write") == 0)

        nand_write(sdram_addr, nand_addr, size);    

    wy_printf("nand %s finished!\n", argv[1]);

    return 0;

}

int pwm(int argc, char *argv[])

{

    pwm_init();

    

    if (argc < 2)

    {

        wy_printf("pwm on - turn on buzzer \n");

        wy_printf("pwm off - turn on buzzer\n");

        return 0;

    }

    if (strcmp(argv[1], "on") == 0)

        pwm_start();

    if (strcmp(argv[1], "off") == 0)

        pwm_stop();

    return 0;

}

void run_command(int argc, char * argv[])

{

    if (strcmp(argv[0], "help") == 0)

    {

        help(argc, argv);

return;

[1] [2] [3]

关键字:Tiny210裸机  PWM控制  蜂鸣器

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/2018/ic-news101241712.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:自己写bootloader倒计时启动内核
下一篇:最后一页

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32f4,pwm控制电机自己的疑惑

这是一个pwm的原理图,对于pwm其实就是一个定时器自我计数,并与我们自己设定的值比较,最终得出高低电平,从而产生有规律的波形其中ARR是计数的最大值,CCRX是我们自己设定的比较值定时器pwm有向上,向下计数,有pwm1,pwm2模式,有输出极性高低的选择1.配置rcc2.配置gpio复用为定时器3.设置定时器pwm的模式并使能(1)PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;   在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平,否则为有效电平。 PWM模式2- 在向上计数时,一旦
发表于 2018-06-28

基于51单片机实现的电机PWM控制及测速

阅读数:2181 
发表于 2018-06-19
基于51单片机实现的电机PWM控制及测速

51单片机+PWM控制渐变七彩灯C51程序

}/**********************************************//**********PWM控制红绿兰3种灯亮灭时间**********//**********************************************/void RGBpwm(uchar Rou,uchar Gou,uchar Bou)//3个局部变量,些部分为带参数函数{ if(Rou!=0)//如果红灯变量不等于0就亮红灯 {  R1=1;//红灯亮  delay(Rou);//红灯亮起时间  R1=0;//红灯灭 } if(Gou!=0)//如果红灯变量不等于0就亮红灯 {  G1=1;//绿灯亮  delay(Gou
发表于 2018-06-19
51单片机+PWM控制渐变七彩灯C51程序

使用TIM3定时输出PWM控制LED灯实现呼吸灯

/*************************************使用TIM3定时输出PWM控制LED灯实现呼吸灯**************************************/void BreathLightInit()//LED初始化{GPIO_InitTypeDef GPIO_InitStructure;   //声明一个结构体变量,用来初始化GPIO/* 开启时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);    /*  配置GPIO的模式和IO口
发表于 2018-06-18

基于UC3846的开关电源电压反馈的优化设计

介绍并比较了电流模式PWM控制器中电压反馈的基本电路,设计出了基于电流控制型PWM控制芯片UC3846的电压反馈的实用电路,该电路能满足在高频电路、非线形负载情况下稳定的输出。实验结果证明,该电路具有较好的控制特性和稳定性。1.UC3846的结构与特性图为电流控制型变换器的原理框图。恒频时钟脉冲置位R-S锁存器,输出高电平,开关管导通,变压器原边的电流线性增大,当电流在采样电阻Rs上的压降Vs达到Ve时,比较器翻转,输出高电平,锁存器复位,驱动信号变低,开关管关断,直到下一个时钟脉冲使R-S锁存器置位。电路就是这样逐个地检测和调节电流脉冲的。UC3846是Initorde公司推出的电流脉宽调制芯片,该调制芯片双端输出,能直接驱动
发表于 2018-01-27
基于UC3846的开关电源电压反馈的优化设计

实现半桥DC/DC变换器软开关的PWM控制解决方案

经常被用于中小功率电路设计的DC-DC转换器一直是工程师们在进行电源设计时候的首选。半桥电路由两个功率开关器件总成,并向外提供方波信号。大家都知道,常见的半桥控制器通常有两种控制方法,一种是对称控制,而另一种则是不对称互补控制,本文主要分析实现半桥DC/DC变换器软开关的PWM控制策略。在本文中缓冲型软开关对称PWM控制策略是指对称控制半桥变换器磁心双向磁化,利用率高,且不存在偏磁。控制方便,控制特性线性。功率管上电压应力低,适用于高输入电压场合,但此种半桥变换器较难实现软开关,变换器效率难以得到提高。对称PWM 控制ZVS半桥变换器对称式PWM 控制ZVS半桥变换器,其与传统半桥电路相比,对称PWM控制的ZVS直流变换器增加了
发表于 2018-01-22

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved