你指的跑飞是什么概念,是你所有的程序都不执行了吗。你可以简单的写个按键啊或者小灯程序测试下,是否内存溢出还是有别的地方有问题,如果全不行,就是试试你的硬件,电压啊,还有干扰等等造成的
三、利用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单片机的下位机程序怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)