2887|5

64

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

怎样将模拟多通道开关的51程序改写成STM32的表达方式 [复制链接]

请多多指点,谢谢。
两个问题:
  函数中,可以看出ABC的值是不停变换(程序里没考虑ABC一直加,溢出怎么办????)
sel_B,代指P1.2. 然后由ABC与0x02运算,得出状态值。 stm32中该如何表达??????

下面是个程序:
#include
#include
sbit     sel_A = P1^1;  多通道开关 A,B,C三个选择端对应80C51的三个端口,从而控制通道开关
sbit     sel_B = P1^2;
sbit     sel_C = P1^3;
unsigned char ABC;
void timer_set();                     //定时器初始化函数
     
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};                     

void IntTimer0() interrupt 1
{
  off_system_interrupt();
  ABC++;//  可以看出ABC的值是不停变换,程序里没考虑ABC一直加,溢出怎么办????
  sel_A=ABC&0x01;  //
  sel_B=ABC&0x02; // sel_B指P1.2. 然后由ABC与0x02运算,得出状态值。 stm32中如何表达??????
  sel_C=ABC&0x03; //
  delayNOP();               //定时消除抖动
  collection_data();
  on_system_interrupt();
}


//  函数名称: timer_set
//  功能说明: 设置定时器工作状态,与硬件有关
void timer_set()
     {
      TMOD=0x22;  //定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装)
      PCON=0x00;
      TH0=(256-100);  
      TL0=TH0;
      ET0=1;
      }
此帖出自stm32/stm8论坛

最新回复

不用位带这么写 #define sel_A_PORT GPIOA #define sel_A_BIT      GPIO_Pin_10 if (ABC&1)   sel_A_PORT->ODR|=sel_A_BIT; else   sel_A_PORT->ODR&=~sel_A_BIT;  详情 回复 发表于 2013-2-23 20:52
点赞 关注
 

回复
举报

4008

帖子

0

TA的资源

版主

沙发
 
给你一个最简捷的位实现:
Dev_GetBit_BB(((u32)&(sel_ABC_port->ODR)),Abit)=Var_GetBit_BB(ABC_Bit, 0);
Dev_GetBit_BB(((u32)&(sel_ABC_port->ODR)),Bbit)=Var_GetBit_BB(ABC_Bit, 1);

用到两个宏函数是stm32的位操作,定义为
#define Var_GetBit_BB(VarAddr, BitNumber)         (*(vu32 *)(RAM_BB_BASE|((VarAddr - RAM_BASE)<<5)|((BitNumber)<<2)))
#define Dev_GetBit_BB(DevAddr, BitNumber)         (*(vu32 *)(DEV_BB_BASE|((DevAddr - DEV_BASE)<<5)|((BitNumber)<<2)))
看着很多很麻烦,但编译后只有两条汇编指令效率极高.
sel_ABC_port是对应的ioport,GPIOAGPIOBGPIOC...
Abit是对应的位最低位依次取0,1,2....
ABC_Bit是变量ABC的地址,ABC_Bit=(u32)&ABC;
此帖出自stm32/stm8论坛
 
 

回复

4008

帖子

0

TA的资源

版主

板凳
 
Dev_GetBit_BB(((u32)&(sel_ABC_port->ODR)),Cbit)=(Dev_GetBit_BB(((u32)&(sel_ABC_port->ODR)),Abit)|Dev_GetBit_BB(((u32)&(sel_ABC_port->ODR)),Bbit))

C=A|B这个有什么用啊

sel_C=ABC&0x03; 这句有疑问....sel_A实际上是ABC计数的2分频sel_B是4分频,sel_C想要8分频的话&0x04

[ 本帖最后由 huo_hu 于 2013-2-23 14:38 编辑 ]
此帖出自stm32/stm8论坛

点评

谢谢,我消化下先。从51到stm32,很不习惯  详情 回复 发表于 2013-2-23 19:40
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 板凳 huo_hu 的帖子

谢谢,我消化下先。从51到stm32,很不习惯
此帖出自stm32/stm8论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

5
 
不用位带这么写
#define sel_A_PORT GPIOA
#define sel_A_BIT      GPIO_Pin_10
if (ABC&1)
  sel_A_PORT->ODR|=sel_A_BIT;
else
  sel_A_PORT->ODR&=~sel_A_BIT;
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

6
 
多谢楼上仁兄。通过您的指点。我已经成功应用了。
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表