stm8程序跑飞了,如何检测是什么原因导致的 可以通过软件中断看出跑飞之前执行了什么 *** 作吗

stm8程序跑飞了,如何检测是什么原因导致的 可以通过软件中断看出跑飞之前执行了什么 *** 作吗,第1张

你指的跑飞是什么概念,是你所有的程序都不执行了吗。你可以简单的写个按键啊或者小灯程序测试下,是否内存溢出还是有别的地方有问题,如果全不行,就是试试你的硬件,电压啊,还有干扰等等造成的

三、利用id做软件加密

1,如果板子上有外部存储器,可以先编写一个程序,利用算法把id计算得到一些值存入外部存储器,然后再烧写真正的程序,真正的程序去校验外部存储器的数据是否合法即可

2,利用板子上按键组合,或是上电按住某些键,程序在这个时候利用算法把id计算得到一些值存入程序区(stm8为EE区),程序运行时去验证程序区数据是否正确

3,轩微编程器有软件加密的功能,编程器会读芯片id,根据算法直接改写缓冲区,达到软件加密的作用

4,读出的id通过一定算法,例如异或加上一个数,得到的数据存入flash(只运行一次,运行后标志位也存入flash),下次读到这个标志位,就不运行这个程序。

四、做软件加密时注意

1,不要在程序中直接出现id地址,例如STM32:1FFFF7E8 1FFFF7EC 1FFFF7F0 STM8: 0x4865~0x4870

2, 利用校验和或是crc对程序区进行校验,防止改程序

朋友,专业家电电脑维修的告诉你,esp8266本身就是个WiFi-32位单片机,你可以给它安装arduino开发环境,编程非常简单!

如果你非要让它成为接收器,你要给它刷at固件,刷好后连接电脑,通过串口发送特定的英文单词at命令就可以了!

和stm8的串口连接,你只需要stm8发送at命令给esp8266就可以了!

有什么不明白的可以问我!

你好,我这边有关XT1511/SK6812灯珠的程序,可以了解一下。

/RGB灯珠,灯带/

#include "IOSTM8S103F3h"

#include "LEDInputDatah"

int main( void )

{

CLK_CKDIVR&= (unsigned char)(~0x18);

CLK_CKDIVR|= (unsigned char)0x00;/设置时钟为内部16M高速时钟/

PC_DDR|=0x20;

PC_CR1|=0x20;

PC_CR2|=0x20;

PC_ODR|=0x20;

reset(); //灯带复位

send_24bits(0xff,0x00,0x00); //第一颗灯亮绿

send_24bits(0x00,0xff,0x00); //第二颗灯亮红

send_24bits(0x00,0x00,0xff); //第三颗灯亮蓝

send_24bits(0xff,0xff,0xff); //第四颗灯亮白

while (1);

}

一般情况下,用单片机的PWM实现LED的渐亮渐灭,当然,PWM也是靠定时器实现的,不过你自己也可以模拟出来。给你一个例程,我是用AVR的片子 第一种,PWM方式: /定时器T2初始化 void timer2_init(void) { TCCR2 = 0x00;//停止定时器 ASSR = 0x00;//异步时钟模式 TCNT2 = 0x00;//初始值 OCR2 = 0x7F;//匹配值,改变此值,即可改变占空比的大小,从而调节亮度 TIMSK |= 0x00;//中断允许 TCCR2 = 0x61;//启动定时器 } 第二种,采用模拟方式,现场写: /定时器T2初始化 void timer2_init(void) { TCCR2 = 0x00;//停止定时器 ASSR = 0x00;//异步时钟模式 TCNT2 = 0x06;//初始值 OCR2 = 0x05;//匹配值 TIMSK |= 0x40;//中断允许 TCCR2 = 0x03;//启动定时器 } //T2溢出中断服务程序 #pragma interrupt_handler timer2_ovf_isr:5 void timer2_ovf_isr(void) { TCNT2 = 0x06; //1ms定时初值 add_num++; //当然,这个得你事先定义好,用于定时器时间累加 if(add_num<a) LED_ON; //灯亮的时间 if(add_num<b) LED_OFF;//灯灭的时间,b>a,如果b=2a,那么占空比即为50%,a就相当于初值了,改变a,b的大小,即可模拟出PWM了 }

//此例程是通过TIM2 CH1(PD4脚)通道来输出一个频率2K 占空比可调的方波,占空比可通过PD7脚的按键调

#include "STM8S105Kh"

typedef unsigned char u8;

typedef unsigned int u16;

u16 value;

void SystemInit(void)

{

CLK_CKDIVR = 0x08; // 16M内部RC经2分频后系统时钟为8M

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

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

}

void GPIO_init(void)

{

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

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

}

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

{

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

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

TIM2_ARRH = 0x07; // 配置PWM分辨率为10位,ARR=0x07D0

TIM2_ARRL = 0xD0; // PWM频率=8M/0x07D0=2000Hz

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

}

void init_devices(void)

{

asm("sim");

SystemInit();

GPIO_init();

TIM2_init();

_asm("rim"); //开总中断

}

void main( void )

{

init_devices();

while(1)

TIM2_CCR1=value;//改变value值可改变频率

}

/

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

功能描述: 中断服务程序

按下PD7口按键来改变占空比

/

@near @interrupt void TLI_IRQHandler (void)

{

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

value+=50;

while(value>1000)

value=0;

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

return;

/

STM8S105 TIM2 TIM3输出PWM PD0 PD3 TIM3输出PWM,/#include "STM8S105Kh"

#include "STM8S105_CLOCKh"

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;

}

以上就是关于stm8程序跑飞了,如何检测是什么原因导致的 可以通过软件中断看出跑飞之前执行了什么 *** 作吗全部的内容,包括:stm8程序跑飞了,如何检测是什么原因导致的 可以通过软件中断看出跑飞之前执行了什么 *** 作吗、STM8程序烧录时怎么加密、如何通过stm8单片机对esp8266执行at指令stm8单片机的下位机程序怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/zz/9298593.html

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

发表评论

登录后才能评论

评论列表(0条)

保存