一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
楼主: WOSS1001
收起左侧

[STM8/STM32] 忙里偷闲,用血糖仪板学STM8-----点亮LED

[复制链接]
发表于 2015-12-11 08:45 | 显示全部楼层
本帖最后由 ayumi7 于 2015-12-11 08:47 编辑
hotdll 发表于 2015-12-10 19:39
知道STVD如何使用类似sbit这样的命令了。
*************************************
用STVD的咋办,STVD ...

STVD 是不支持 sbit  
这样子定义 就和 C51 的 sbit 一模一样的效果
_Bool HC595_SDA @PC_ODR:4;//位声名
_Bool HC595_SCK @PC_ODR:3;//位声名
_Bool HC595_RCK @PB_ODR:4;//位声名
_Bool LED0 @PD_ODR:1;

_Bool PINA @PC_IDR:4; //DOWN
_Bool PINB @PC_IDR:5;        //UP
_Bool MUTE @PC_IDR:3;


用法例如

@PB_ODR:4   ODR 是定义输出IO@PC_IDR:3;   IDR 是输入


PINA =1;
if(PINA==0)



自己去试试吧 哈哈


发表于 2015-12-11 09:27 | 显示全部楼层
ayumi7 发表于 2015-12-11 08:45
STVD 是不支持 sbit  
这样子定义 就和 C51 的 sbit 一模一样的效果
_Bool HC595_SDA @PC_ODR:4;//位声 ...

这位朋友也是高手.

这样的写法,我没试过,因为我不用STVD,,,,
貌似用IAR的会比STVD要多...

从51转向STM这一类的MCU,初学者可能有些不习惯.

像 51 的IO 是双向的,STM8 的虽然是双向,
但是,一般要切换输入方向(在某些情况下非必需),然后读写要分别用 IDR/ODR .
而不像51 的那么简单,只要一句就可以完成.
发表于 2015-12-11 09:42 | 显示全部楼层
本帖最后由 hotdll 于 2015-12-11 09:48 编辑
ayumi7 发表于 2015-12-11 08:45
STVD 是不支持 sbit  
这样子定义 就和 C51 的 sbit 一模一样的效果
_Bool HC595_SDA @PC_ODR:4;//位声 ...

谢谢大神。
能不能详细的解释下,这是什么语法?
_Bool 是什么意思?
怎么来的?看名字是宏定义?
这个@是汇编指令还是C语言的指令? 貌似类似汇编的伪指令at。

但是如果可以这么用PC_ODR:4,这个是如何定义的?cosmic编译器定义的?
发表于 2015-12-11 09:52 | 显示全部楼层
hotdll 发表于 2015-12-11 09:42
谢谢大神。
能不能详细的解释下,这是什么语法?
_Bool 是什么意思?

  我也是菜鸟  程序都是别人那里粘过来的  人家这样子用我 就这样子用了   反正好用的   

不管是STVD   IAR 用宏定义  都可以做到这样子的效果


发表于 2015-12-11 10:10 | 显示全部楼层
本帖最后由 hotdll 于 2015-12-11 10:11 编辑
ayumi7 发表于 2015-12-11 09:52
我也是菜鸟  程序都是别人那里粘过来的  人家这样子用我 就这样子用了   反正好用的   

不管 ...

昨天百度的时候找到这个用法,但是不知具体实现过程。在cosmic的帮助里有这个用法的说明,但是我想知道语法的具体实现过程。

另外实际使用的时候前面要加个关键字volatile ,否则编译器的优化会导致程序可能出错。

发表于 2015-12-11 10:11 | 显示全部楼层
hotdll 发表于 2015-12-11 09:42
谢谢大神。
能不能详细的解释下,这是什么语法?
_Bool 是什么意思?

这个
_Bool 估计是 Cosmic C  内置的一种用法.
像IAR的那种写法:
PA_ODR_ODR1
其实可以从头文件中找出原型的:
如:
  1. #define PA_ODR_ODR1              PA_ODR_bit.ODR1
复制代码
然后可以看到,他的原型是结构体中的一个变量.
  1. #ifdef __IAR_SYSTEMS_ICC__
  2. typedef struct
  3. {
  4.   unsigned char ODR0        : 1;
  5.   unsigned char ODR1        : 1;
  6.   unsigned char ODR2        : 1;
  7.   unsigned char ODR3        : 1;
  8.   unsigned char ODR4        : 1;
  9.   unsigned char ODR5        : 1;
  10.   unsigned char ODR6        : 1;
  11.   unsigned char ODR7        : 1;
  12. } __BITS_PA_ODR;
  13. #endif
  14. __IO_REG8_BIT(PA_ODR,      0x5000, __READ_WRITE, __BITS_PA_ODR);
复制代码
__IO_REG8_BIT 这个估计是IAR的一种用法,可能是把整个结构体(.ODR0~.ODR7) 映射到地址:0x5000;
而查数据手册可知
PA_ODR.png

0x5000正好是 PA_ODR 的地址所在:


找到这么篇文章,或许对你有帮助:
http://www.51hei.com/bbs/dpj-31009-1.html

我属于那种知其然不知所以然的人,可用就好,就不深究了.
发表于 2015-12-11 13:12 | 显示全部楼层
junyee 发表于 2015-12-11 10:11
这个
_Bool 估计是 Cosmic C  内置的一种用法.
像IAR的那种写法:

多谢兄弟指点迷津,现在大体上知道怎么回事了。

 楼主| 发表于 2015-12-18 08:51 | 显示全部楼层
本帖最后由 WOSS1001 于 2015-12-18 08:52 编辑

笨死了,一个TIME4定时中断搞了几天都没搞好。好像是进不了中断。请大家帮忙看看
中断寄存器设置部分
TIM4_IER = 0X00;   //TIM4 Interrupt enable register 使能
        TIM4_EGR = 0X01;   //TIM4 Event generation register 事件
        TIM4_PSCR = 0X01;    //TIM4 prescaler register 预分频器
        TIM4_ARR = 255;       //TIM4 Auto-reload register 自动重装
        TIM4_CNTR = 255;
    TIM4_CR1 = 0X81;    //TIM4 control register 1 控制
        TIM4_IER = 0X01;
        _asm("rim");

中断函数
@far @interrupt void TIM4_IRQ(void)
{
        static unsigned char i;
       
        TIM4_SR1 = 0X00;
        i++;
        /*if(i==200)
        {
            LED1 = !LED1;
        i = 0;
    }*/
        LED1 = 0;
        return;
}
中断向量
{0x82, TIM4_IRQ}, /* irq25 */
这个是IRQ25吗?有的说是IRQ23
       
发表于 2015-12-21 07:53 | 显示全部楼层
这个好,STM8的血糖仪开山之作。
发表于 2015-12-21 08:25 | 显示全部楼层
WOSS1001 发表于 2015-12-18 08:51
笨死了,一个TIME4定时中断搞了几天都没搞好。好像是进不了中断。请大家帮忙看看
中断寄存器设置部分
TIM ...

我查 了下我写的代码中:
TIM4处:


#pragma vector=0x19


IAR的中断向量地址和 STVD的不一样,好像有2还是4的偏移,你查一查.

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-25 13:22 , Processed in 0.054389 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表