当前位置:首页 » 编程语言 » stm8s的c语言编程例程
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

stm8s的c语言编程例程

发布时间: 2022-12-14 02:29:10

① STM8的C语言延时及外部中断编程

研究了下,你描述的逻辑好像有矛盾,
我疑问如下:

控制过程如下:
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是偶数时怎么处理?)。

。。。。。。。。。。。

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

② STM8S系列程序示例

/*********************************************
* STM8S105* TIM2 TIM3输出PWM PD0 PD3 TIM3输出PWM,*********************************************/#include "STM8S105K.h"
#include "STM8S105_CLOCK.h"
typedef unsigned char u8;
typedef unsigned int u16;u16 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;
}