应广 Mini-C 语言开发PMS150G——入门知识

摘要:本文介绍了开发 PMS150G 的 ide ——FPPA0,官方实例程序的讲解,以及入门 mini-C 编程的基础知识(尤其是学会用 $ 脚本命令配置寄存器)

文章最后提供了 mini-C 编程助手的下载连接。

〇、初步认识 PMS150G 并认识开发环境

OTP单片机以消费类电子市场,价格低廉著称.今天就以应广PMS150G(1毛/片)芯片学习一下应广公司的Mini-C语言.
Mini-C语言是台湾应广公司推出的自家单片机开发语言,兼容C语言,支持的语法更少更容易上手,既然是一种新的兼容语言自然要研究一下.到应广网站下载最新版本,出新版本以后旧版本不可以运行.

软件很小13.5MB,别被他迷惑,仿真部分在仿真器内部,烧录部分在烧录器内部.这样一来想用1毛钱单片机成本一下就上来了,很多人就被仿真器下载器的价格挡在外面了.没有仿真器烧录器软件是可以生成.PDK烧录文件的.

这软件直接就是中文的,点一个赞,调整输入法中文下使用英文标点这样在标点符号上不出错,

  • 新建一个工程,点击:档案,开新项目.
  • 选择Mini-C,自己填入工程名称,文件位置,
  • 芯片系列:本次采用的是PMS系列.芯片型号:PMS150G.
  • 除此之外,还有系统时钟、是否使能watchdog和PA5的功能选项。

点击OK.新建项目就完成了,系统给出了工程列程:

#include “extern.h”
void FPPA0 (void)
{
    .ADJUST_IC SYSCLK=IHRC/4 // SYSCLK=IHRC/4
    // Insert Initial Code
    while (1)
    {
        // …
        // wdreset;
    }
}

void Interrupt (void)
{
    pushaf;
    if (Intrq.T16)
    { 
        // T16 Trig
        // User can add code
        Intrq.T16 = 0;
        //…
    }
    popaf;
}


看看,是不是既熟悉又陌生.是C这语法又没见过,我来逐条给你解释:

#include “extern.h” :引入头文件.

void FPPA0 (void) :进入主函数(应广有4核,8核单片机FPPA0~ FPPA7).

.ADJUST_IC SYSCLK=IHRC/4 :调整系统时钟为4Mhz,系统16Mhz.

void Interrupt (void) :中断函数.

pushaf; :压栈

Intrq.T16 = 0; : Intrq的某一位,

popaf; :出栈

点击:执行,建制.也可以直接点双箭头的建制. 0 error(s), 1 warning(s), 马上去看一下警告信息’Interrupt’ not be used, and be bypass(不使用“中断”,而是绕过),不用中断注释掉/…/或者不用删除掉.0 error(s), 0 warning(s)这样新建一个工程就完成了.

 

一、学会配置时钟和使用GPIO

要想使用和控制单片机第一步就是能控制引脚输出高低电平,

// pms150g
// ______ ______
// 5v-|1-vdd gnd-8|-gnd
// -  |2-pa7 pa0-7|-led
// -  |3-pa6 pa4-6|-
// -  |4-pa5 pa3-5|-anjian
//
#include “extern.h”

led bit pa.0;
anjian bit pa.3;

void FPPA0 (void)
{
    .ADJUST_IC SYSCLK=IHRC/4 //SYSCLK=IHRC/4(IHRC固定为16MHz,SYSCLK则为4MHz)
    $ led out,Low; //输出,低
    $ anjian in,ph; //输入,开上拉电阻
    //
    while (1)
    {
        if(led){led =0;} else{led =1;} //led反转
        if(anjian ==0){while(anjian ==0){led =1;}} //按键按下灯一直亮
        .delay 2000000; //延时半秒
    }
}
//

解释一下代码:

Led bit pa.0; :引脚重命名,以后直接操作led=1, led=0.

anjian bit pa.3; :定义按键在pa.3引脚.

$ led out,Low; :输出,低.$配置引脚更直观,比配置pa,pac,paph,papl更直观.

$ anjian in,ph; :输入,开上拉电阻,配置语法自然是要查看软件本身的使用手册 ,点击软件上边最右边的使用手册,打开常见问题索引,KeyWord查询,配置语法自然是要查看软件本身的使用手册,点击软件上边最右边的使用手册,打开常见问题索引,KeyWord查询, IO.可以具体查看配置方法.
if(led){led =0;} else{led =1;} :为什么这样写?~led这样写不行么?

led本身就是pa的一个位,但是对于 | 和 & 运算,只能操作一个寄存器,而不能操作位.想要操作一个位pa |=0x01; pa.0=1;都做不到取反,pa ^=0x01;倒是可以但又难理解, led ^=1;这种写法语法错误,只有用if判断这种方法最容易理解.
if(anjian ==0){while(anjian ==0){led =1;}} //按键按下程序会一直卡在这里灯一直亮

.delay 2000000; :想要延时多长时间太简单了系统时钟是4Mhz那.delay 4M次就是1秒钟,是不是很简单.

仿真,必须插上仿真器才能进入仿真模式.点击继续执行进入仿真模式,如果没有仿真器就会跳出一个界面提示没有仿真器:Can not detect 5S-I-xxx ICE.

单核仿真器有两种这种简易版的方便实惠.插上仿真器会自动安装驱动.这时再点击继续执行就会进入调试模式.点击放大镜的反组译码就可以查看C对应的汇编程序,编译的非常规整就像手写的一样而且大部分都认识,这时单步执行这时仿真器就可以代替芯片在实际电路板上运行了,点击继续执行就可以全速运行,可以设置断点辅助调试,这时每秒闪一次效果就达到了.按键按着灯就会一直亮.

二、应广单片机编程——学会使用$配置寄存器.

// pms150g
// ______ ______
// 5v-|1-vdd gnd-8|-gnd
// -  |2-pa7 pa0-7|-
// -  |3-pa6 pa4-6|-anjian
// -  |4-pa5 pa3-5|-led
//
#include “extern.h”
anjian bit pa.4;
//
void FPPA0 (void)
{
    .ADJUST_IC SYSCLK=IHRC/4 //SYSCLK=IHRC/4
    $ anjian in,ph; //输入,开上拉电阻
    $ tm2c SYSCLK,PA3,PWM; //timer2控制寄存器
    tm2ct =0; //timer2计数器
    tm2b =100; //timer2上限寄存器
    $ tm2s 8BIT,/1,/2; //timer2分频寄存器

    //
    byte a1;
    a1 =100;
    while (1)
    {
        if(anjian ==0){a1++;} //按键按下灯一直亮
        tm2b =a1;
        .delay 40000; //延时半秒
    }
}

代码解析:

$ anjian in,ph;//输入,开上拉电阻

$ tm2c SYSCLK,PA3,PWM;//timer2控制寄存器

tm2ct =0; //timer2计数器

tm2b =100; //timer2上限寄存器

$ tm2s 8BIT,/1,/2; //timer2分频寄存器

使用配置寄存器是应广单片机一大特点 , 最主要是直观 , 跟我来看一下是怎么使用的.

打开方案总管,打开左边栏找到.inc文件打开.再找到pms150g说明书,先看想用pwm都需要配置什么寄存器.

第一个: $ tm2c SYSCLK,PA3,PWM; timer2控制寄存器,tm2c的7-4位选择时钟频率源,再打开inc文件找到tm2c $ 7 ~ 4 : STOP, SYSCLK, IHRC, X, ILRC, GPCRS, X, X,直接想选哪个就复制那个就可以了,不配置的可以写X或者不写,大大的避免了出错和混乱.

tm2ct, timer2计数器.这个不停的加数脉冲来一个加1. 不停的和tm2b去比较相等就翻转.

tm2b,timer2上限寄存器.只要修改这个寄存器的值就能修改pwm脉宽了.

$ tm2s 8BIT,/1,/2; timer2分频寄存器每来一个脉冲计数器就加一.
byte a1; Mini-C的数据类型

  • byte八位,
  • word十六位,
  • eword二十四位,
  • dword三十二位.

别的数据类型不支持,随意在任何位置都可以申请变量无任何限制.
本程序功能按键按下亮度增加.

三、miniC 语言特点

很多廉价的单片机只是支持汇编语言,而应广的单片机支持mini-c,非常不错!可以最大限度发挥C的优势和编译器的效率.

,对了mini-c不是c-,而是汇编+.下面简单介绍miniC语言的特点——

缺点:

  • 函数不能带参数.

解决方法:通过A或全局变量进行参数传递;

或者更新IDE版本,最新版本的IDE已经可以带参数,但是不建议带型参,

  • 不能使用for循环

   解决方法:用while循环代替for循环.

i=6;

while(i--)
{
    /*循环体*/
}
  • 数组和指针功能弱化

   解决方法:其指针功能还是可以用的,也使用rom查表,使用ram查表

  • 不支持全局变量定义同时进行初始化
解决方法:在初始化的时候记得对全局变量进行初始化.新的IDE好像支持了.
 
   在初始化的时候用Init_ram;
 
可以使用下面的设置
 
.ADJUST_IC    , IHRC=16MHz, SYSCLK=IHRC/2,VDD=3.3V,Init_ram;
 
1.把IHRC校准到到16M
2 系统时钟设置为 8M
3,仿真器vdd电压为3.3V
4.把单片机的ram全部请0
  • Bit变量只支持写入0,或1,不支持直接bit变量取反

解决方法 :

if(uBitFlag)
{
    uBitFlag=0;
}
Else
{
    uBitFlag=1;
}

优点:

  • 函数不带参数,可以节省堆栈空间,体现其mini特点,最新版本的IDE已经支持带参数了。可以到官网下载更新
  • 支持ROM查表
  • .delay时间非常准确,无需手工计算:假如系统时钟是8M,那么.delay 8000;就是延时1ms;
  • 支持bit变量,节省ram空间,支持字,字节拆分,bit拆分,

    比如定义byte   m;

    你可以直接用m.0 ~到m.7这些符号,可以直接读写和修改.

    比如之前要判断m的最高位是不是为1,那么要用if(0x80&m)

    现在可以用if(m.7)替代;

   比如定义 word usTmr; 那么可以 直接对 usTmr$0 和usTmr$1进行直接的读写和修改

          比如要取高8bit  byte  i=usTmr>>8; 现在可以直接用 byte  i=usTmr$0;

  • 官方提供了mini-c编程助手

mini-c编程助手是入门者的利器,也是开发者的宝库。你想要的的基础代码基本都可以在这个案例库里面找到

下载中心-芯达电子科技有限公司

 

 

参考资料:

1. 《应广Mini-C语言开发PMS150G》(上、中、下):
https://blog.csdn.net/weixin_44512551/article/details/133421128
https://blog.csdn.net/weixin_44512551/article/details/133421132
 
2. CSDN 作者 zhongvv  的文章:
《应广单片机应用之--滚码》:
原文链接:https://blog.csdn.net/zhongvv/article/details/105704261
 
《应广单片机MINI-C编程要点》
https://blog.csdn.net/zhongvv/article/details/103610995
 
posted @ 2024-05-23 22:39  FBshark  阅读(433)  评论(0编辑  收藏  举报