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

}

文件:main.c

用途:

注销滚意:内部8M晶振

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

#include <iom128v.h>

unsigned char LED_table[]={0xFF,0x00,0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xFF,0x00,0xFF,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,0x00,0xFF,0x7E,0xBD,0xDB,0xE7,0xFF,0x00,0xE7,0xDB,0xBD,0x7E,0xFF,0x00}

用途:延时函数

注意:系统时钟8M

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

void delay_1us(void) //1us延时函数

{

asm("nop")

}

void delay_nus(unsigned int n) //N us延时函数

{

unsigned int i=0

for (i=0i<ni++)

delay_1us()

}

void delay_1ms(void) //1ms延亏猛余时函数

{

unsigned int i

for (i=0i<1140i++)

}

void delay_nms(unsigned int n) //N ms延时知拍函数

{

unsigned int i=0

for (i=0i<ni++)

delay_1ms()

}

void main(void)

{

unsigned char i=0

PORTA = 0xFF

DDRA = 0xFF

DDRE=0XFF

PORTE=0XFF

while(1)

{

if(i==36) i=0

PORTA = LED_table[i++]

delay_nms(80)

}

}

研究了下,你描述的逻辑好像有矛盾,

我疑问如下:

控制过程如下:

pin17(PC7)收到低电平脉冲信号(脉冲长度多少?),

计时器启动(计数时间5秒?),

pin19(PD2)输纯散皮出高电平(在计数计数结束后输出低电平?);

当m为奇数时,pin13(PC3)输出高电平(PIN14输出低电平?);

当m为偶数时,pin14(PC4)输出高电平(PIN13输出低电平?)。

最终计数结束后输出状态如何?

pin10(PA3)有高电平脉冲信号输入时(脉冲长度多少?),

pin19(PD2)停止输出(输出低电平还是做差高电平?);

如果在一个计时周期内(5秒吗?),

pin10(PA3)没有高电平信号输入(一直维持低电平吗?),

则pin18(PD1)输出高电平(有高电平脉冲信号时输出低电平?)。

pin15(PC5)有高电平脉冲信号输入时(脉冲长度多少?),

pin13(PC3)停止输出(输出低电平还是高电平?);

如果在一个计时周期内(5秒吗?),

pin15(PC5)没有高电平信号输入(一直维持低电平吗?),

且计数器值m为奇数,则pin18(PD1)输出高电平(m是偶数时怎么处理?)。

。。。。。。。。掘拆。。。

主要程序到底是触发后输出一个序列电平还是测量输入脉冲?


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

原文地址:https://54852.com/yw/12325049.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存