STM8S系列程序示例

STM8S系列程序示例,第1张

/*********************************************

* STM8S105* TIM2 TIM3输出PWM PD0 PD3 TIM3输出PWM,*********************************************/#include "STM8S105K.h"

#include "STM8S105_CLOCK.h"

typedef unsigned char u8

typedef unsigned int u16u16 value

/*******************************************************************************

*** 函数名 : void SystemInit(void)

*** 功能描述: 系统初始化

*** 函数说明: 系统全局初始化

******************************************************************************/

void SystemInit(void)

{ SystemClock_Init()

CLK_PCKENR1 |= 0x60 //使能TIM2与TIM3与主频连接

PD_CR2 |= 0x80//使能PD7口外部中断

}

/*******************************************************************************

*** 函数名 : void main(void)

*** 功能描述: 主函数

*** 函数说明:

******************************************************************************/

void GPIO_init(void)

{

PD_DDR = 0x1F//配置PD端口的方向寄存器全输出

PD_CR1 = 0x1F//设置PD为推挽输出

PB_DDR|= 0x04//PB2输出

PB_CR1|= 0x04//PB2推挽输出

PB_ODR|= 0x04//开5V电源

}

void TIM2_init(void) //TIM2 CH1 工作于模式1

{

// TIM2_CCMR2= 0x60 // PWM 模式 1

TIM2_CCMR1= 0x60 // PWM 模式 1,TIM2 CH1

TIM2_CCER1= 0x03 // CC1配置为输出

//TIM2_CCER2= 0x03 // CC3使能

TIM2_ARRH = 0x03 // 配置PWM分辨率为10位,ARR=0x3FF

TIM2_ARRL = 0xFF // PWM频率=8M/0x03FF=7820Hz

TIM2_CR1 |= 0x01 // 计数器使能,开始计数

}

void TIM3_init(void) //TIM3 CH1 ch2工作于模式2,1

{

TIM3_CCMR1= 0x70 //PWM模式2

TIM3_CCMR2= 0x60 // PWM 模式 1

TIM3_CCER1= 0x33 // CC1 CC2配置为输出,CH1 CH2

TIM3_ARRH = 0x03 // 配置PWM分辨率为10位,ARR=0x3FF

TIM3_ARRL = 0xFF // PWM频率=8M/0x03FF=7820Hz

TIM3_CR1 = 0x01 // 计数器使能,开始计数

} void Run(void)

{ //TIM2_CCR2H = (unsigned char)(value>>8) // 更新CC2比较寄存器

//TIM2_CCR2L = (unsigned char)(value)

TIM2_CCR1=value

//TIM2_CCR3=value

TIM3_CCR2=value

TIM3_CCR1=value //注意每个通道都要设CCR

} void init_devices(void)

{

_asm("sim")

SystemInit()

GPIO_init()

TIM2_init()

TIM3_init()

_asm("rim")

} void main( void )

{

init_devices()

while(1)

Run()

} /****************************************************************************

*** 函数名 : @near @interrupt void TLI_IRQHandler (void)

*** 功能描述: 中断服务程序

*** 函数说明:

*****************************************************************************/

@near @interrupt void TLI_IRQHandler (void) {

PD_CR2 &= 0x7F //关PD7外部中断

value+=50

while(value>1000)

value=0 PD_CR2 |= 0x80 //使能PD7口外部中断

return

}

题目不清楚,假设8个灯,整体循环一次的时间是80s,后一个灯亮了3s后前一个灯才允许熄灭。那么可以用定时器,定时器中采用一个变量aaa进行计数累加,比如设定一个1s的定时器,每次进入定时器变量aaa加1,aaa加到80就清零重新累加。

定时器中点亮程序:if(aaa<10){把1号灯点亮};else if(aaa<20){把2号灯点亮}else if(aaa<30){把3号灯点亮}else if(aaa<40){把4号灯点亮}else if(aaa<50){把5号灯点亮}else if(aaa<60){把6号灯点亮}else if(aaa<70){把7号灯点亮}else if(aaa<80){把8号灯点亮}

定时器中熄灭程序:if(aaa>73){把7号灯熄灭};else if(aaa>63){把6号灯熄灭}else if(aaa>53){把5号灯熄灭}else if(aaa>43){把4号灯熄灭}else if(aaa>33){把3号灯熄灭}else if(aaa>23){把2号灯熄灭}else if(aaa>13){把1号灯熄灭}else if(aaa>3){把8号灯熄灭}

这样就可以实现。方法有很多,这只是举个简单例子。

STM32不同地址里的程序运行的LED0=0这条C指令编译器把它转换成了3条汇编指令MOVS、LDR、STR,这三句汇编分别对应的机器码就是2000、490B、6008。

STM32不同地址一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线送入到存储器,然后逐条取出执行。但单片机中的程序一般事先我们都已通过写入器固化在片内或片外程序存储器中。因而一开机即可执行指令。

STM32不同地址大端模式:

STM32不同地址所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放。

例子:0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000。0000440: b484 6c4e 004e ed00 0000 0000 0100 0000。在大端模式下,前32位应该这样读: e6 84 6c 4e ( 假设int占4个字节)。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11225947.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存