[技术问答] 使用Embitz 1.0开发M051 capture输入捕捉功能

[复制链接]
 楼主| 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, 下载次数: 24

mintspring 发表于 2017-5-3 16:52 | 显示全部楼层
楼主是个Embitz的狂热粉丝啊。
598330983 发表于 2017-5-3 22:36 | 显示全部楼层
漂亮,楼主好认真,虽然小小的修改,但是很有用。
 楼主| Lbsonggz 发表于 2017-5-3 22:57 | 显示全部楼层
尊重版权而已,喜欢GCC,开发ARM7咱们用的是WinARM,开发ATmega用的则是WinAVR,够矫情吧
dianbeng007 发表于 2017-9-25 14:48 | 显示全部楼层
不错,有点创新
598330983 发表于 2017-9-26 17:04 | 显示全部楼层
  1. /*
  2. **
  3. **                           Main.c
  4. **
  5. **
  6. **********************************************************************/
  7. /*
  8.    Last committed:     $Revision: 00 $
  9.    Last changed by:    $Author: $
  10.    Last changed date:  $Date:  $
  11.    ID:                 $Id:  $

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

  17. /*---------------------------------------------------------------------------------------------------------*/
  18. /*                                                                                                         */
  19. /* Copyright(c) 2010 Nuvoton Technology Corp. All rights reserved.                                         */
  20. /*                                                                                                         */
  21. /*---------------------------------------------------------------------------------------------------------*/

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

  27. #include "common.h"

  28. /***************************************************************************************
  29. 描述 :   Capture中断处理函数
  30. ****************************************************************************************/
  31. void PWMA_IRQHandler(void)
  32. {
  33.     uint16_t uiLow_Pulse, uiHigh_Pulse;
  34.     uint32_t u32status;

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

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

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

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

  49.     UART_Init();Show_Pass();

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

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

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

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

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

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

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

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

  71.     while(1);

  72.     return 1;
  73. }
598330983 发表于 2017-9-26 17:06 | 显示全部楼层
如果细致的捋一遍,其实每个部分都不是很难,寄存器那么多,实现的功能组合基本上都是那些。楼主的努力很棒。
598330983 发表于 2019-3-20 21:50 | 显示全部楼层
大神,现在还在用这个吗

评论

我一直在用emBITZ,这段时间忙着给学生上课,就暂时搁置了  发表于 2020-4-22 09:04
21mengnan 发表于 2020-1-16 20:20 | 显示全部楼层
前来学习。
21mengnan 发表于 2020-1-16 20:21 | 显示全部楼层
官网看了一下,说2.0马上发布。
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
wdliming 发表于 2020-4-20 09:42 | 显示全部楼层
期待2.0发布,我今天也移植了hal库,成功下载运行 了
598330983 发表于 2020-4-27 23:51 | 显示全部楼层
看来未来可期。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

240

帖子

9

粉丝
快速回复 在线客服 返回列表 返回顶部