打印
[技术问答]

使用Embitz 1.0开发M051 capture输入捕捉功能

[复制链接]
1301|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Lbsonggz|  楼主 | 2017-5-2 09:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. 使用uart.c和uart.h中修正之后的void Send_Sting_To_PC (char *s);
2. 使用增加了return 1;语句的main函数
3. 修改之后的启动文件和ld文件
4. P2.1(PWM1)输出PWM波形,P2.0(捕获器0)捕获PWM1输出波形的低电平和高电平周期,短接P2.0和P2.1两脚

M0516capture.zip

268.18 KB

沙发
mintspring| | 2017-5-3 16:52 | 只看该作者
楼主是个Embitz的狂热粉丝啊。

使用特权

评论回复
板凳
598330983| | 2017-5-3 22:36 | 只看该作者
漂亮,楼主好认真,虽然小小的修改,但是很有用。

使用特权

评论回复
地板
Lbsonggz|  楼主 | 2017-5-3 22:57 | 只看该作者
尊重版权而已,喜欢GCC,开发ARM7咱们用的是WinARM,开发ATmega用的则是WinAVR,够矫情吧

使用特权

评论回复
5
dianbeng007| | 2017-9-25 14:48 | 只看该作者
不错,有点创新

使用特权

评论回复
6
598330983| | 2017-9-26 17:04 | 只看该作者
/*
**
**                           Main.c
**
**
**********************************************************************/
/*
   Last committed:     $Revision: 00 $
   Last changed by:    $Author: $
   Last changed date:  $Date:  $
   ID:                 $Id:  $

**********************************************************************/
/*与启动文件和ld配置文件匹配,SystemInit()函数不可删除*/
#ifndef __NO_SYSTEM_INIT
void SystemInit (void) {}
#endif

/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2010 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

/***************************************************************************************
  M051输入捕获demo代码,外接12MHz晶体,超级终端115200波特率可显示输出信息.
  注:需要短接P2.0和P2.1引脚。
  P2.1(PWM1)输出PWM波形,P2.0(捕获器0)捕获PWM1输出波形的低电平和高电平周期。
****************************************************************************************/

#include "common.h"

/***************************************************************************************
描述 :   Capture中断处理函数
****************************************************************************************/
void PWMA_IRQHandler(void)
{
    uint16_t uiLow_Pulse, uiHigh_Pulse;
    uint32_t u32status;

    u32status = CCR0A;                               //获取Capture通道0控制寄存器的值
    CCR0A |= CAPIF0;                                 //清除Capture0中断标志

    uiLow_Pulse = CNR0A - CRLR0A;                    //计算低脉冲宽度
    uiHigh_Pulse = CNR0A - CFLR0A;                   //计算高脉冲宽度

    if (u32status & CFLRI0)                          //如果Capture0捕获到一个下降沿,表示一个完整的PWM周期捕获完成
        printf("Low Duty: %4d/%d, High Duty: %4d/%d\n", uiLow_Pulse, uiLow_Pulse + uiHigh_Pulse, uiHigh_Pulse, uiLow_Pulse + uiHigh_Pulse);
}

int main(void)
{
    Un_Lock_Reg();                                   //解锁被保护的寄存器位,以便用户访问
    PWRCON |= XTL12M_EN;                             //使能外部12MHz晶振
    while((CLKSTATUS & XTL12M_STB) == 0);            //等12M晶振时钟稳定
    CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;        //选外部12MHz晶振为系统时钟
    Lock_Reg();                                      //重新锁被保护的寄存器位

    UART_Init();Show_Pass();

    Send_String_To_PC("press Enter to start...\n");
    getchar();

    P2_MFP = P2_MFP & (~(P20_AD8_PWM0 | P21_AD9_PWM1)) | (PWM0 | PWM1); //设置P2.0,P2.1为PWM0和PWM1功能
    P2_PMD = P2_PMD & (~(Px0_PMD | Px1_PMD)) | (Px1_OUT | Px0_QB);      //配置P2.0和P2.1为准双向模式和输出模式

    APBCLK |= PWM01_CLKEN;                           //使能PWM0,1时钟
    CLKSEL1 = (CLKSEL1 & (~PWM01_CLK)) | PWM01_12M;         //选择外部12M晶振输入作为Capture0和PWM1时钟源

    PPRA = 0x000000FF;                               //设置PWM0,1时钟预分频值为(255+1)=256
    CSRA = 0x00000033;                               //设置PWM0,1时钟分频值为16
    PCRA |= (CH0_AU_RL | CH1_AU_RL);                 //设置Capture0和PWM1为自动重载模式

    CNR0A = 0xFFFF;                                  //设置Capture0重载寄存器的值
    CCR0A &= ~INV0_ON;                               //禁止Capture0反向功能
    CCR0A |= CAPCH0EN;                               //使能PWM通道0捕捉功能
    CAPENRA |= CAPCH0_ON;                            //使能Capture0通道输入有效

    PIERA |= PWMIE0;                                 //使能PWM通道0中断
    CCR0A |= CFL_IE0;                                //使能Capture0下降沿锁定中断
    CCR0A |= CRL_IE0;                                //使能Capture0上升沿锁定中断
    NVIC_ISER = PWMA_INT;                            //使能NVIC PWM0~3中断

    CNR1A = 255;                                     //设定PWM1输出周期为256个PWM时钟周期
    CMR1A = 63;                                      //设定PWM1输出高电平周期为64个PWM时钟周期

    POEA = PWM1_OE;                                  //PWM1输出使能
    PCRA |= (CH0EN | CH1EN);                         //使能PWM0,1下数计数器开始计数

    while(1);

    return 1;
}

使用特权

评论回复
7
598330983| | 2017-9-26 17:06 | 只看该作者
如果细致的捋一遍,其实每个部分都不是很难,寄存器那么多,实现的功能组合基本上都是那些。楼主的努力很棒。

使用特权

评论回复
8
598330983| | 2019-3-20 21:50 | 只看该作者
大神,现在还在用这个吗

使用特权

评论回复
评论
Lbsonggz 2020-4-22 09:04 回复TA
我一直在用emBITZ,这段时间忙着给学生上课,就暂时搁置了 
9
21mengnan| | 2020-1-16 20:20 | 只看该作者
前来学习。

使用特权

评论回复
10
21mengnan| | 2020-1-16 20:21 | 只看该作者
官网看了一下,说2.0马上发布。

使用特权

评论回复
11
21mengnan| | 2020-1-16 20:22 | 只看该作者
新的Embitz 2.0即将推出,重点是:

Hotplug菜单,无需停止即可连接正在运行的目标(并使用实时变量和OS工具进行检查)
带有闪存擦除和程序菜单的新调试接口引擎
GDB服务器被EBlink,已经可以下载的EBlink win32和Linux_x86-64取代
最新的GCC工具链


EBlink和Embitz的源代码将托管在https://git.embitz.org/上。
我们希望首先发布EBlink代码,而Embitz会尽快发布。

EmBitz 1.10

CRC32:341EAE57
MD4:7FFF54916895895CBA9778912CE39BC432A
MD5:6B4F0301A6D42614995BD101ACCDDFAB
SHA-256:29B8EDF17F2CFC4C8065E5464A20BCA0FEE3406B93D0AC7A12B8FEBBCCDC2ECD

使用特权

评论回复
12
wdliming| | 2020-4-20 09:42 | 只看该作者
期待2.0发布,我今天也移植了hal库,成功下载运行 了

使用特权

评论回复
13
598330983| | 2020-4-27 23:51 | 只看该作者
看来未来可期。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

236

帖子

6

粉丝