怎样将模拟多通道开关的51程序改写成STM32的表达方式

2019-03-23 19:19发布

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

下面是个程序:
#include <reg51.h>
#include <intrins.h>
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;
      } 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
Li_Lei
1楼-- · 2019-03-23 22:43
/ 给你一个最简捷的位实现:
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;
Li_Lei
2楼-- · 2019-03-24 01:00
 精彩回答 2  元偷偷看……
yanse51
3楼-- · 2019-03-24 04:38
谢谢,我消化下先。从51到stm32,很不习惯
Li_Lei
4楼-- · 2019-03-24 10:29
不用位带这么写
#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;
yanse51
5楼-- · 2019-03-24 13:43
 精彩回答 2  元偷偷看……

一周热门 更多>