首页 > 编程知识 正文

stm32芯片烧录程序,stm32程序加密芯片

时间:2023-05-04 11:34:59 阅读:158131 作者:5000

以下是. h文件。

# ifndef _ TM 1650 _ I2C _ h # define _ TM 1650 _ I2C _ h # include ' stm8s.h ' # include ' stm8s _ gpio.h # include TM1650芯片控制20路灯函数PB7是SCL端口PB6是SDA端口*****的dfinescl _ TM 1650 PC _ ODR _ ODR7# defines da _ TM 1650 PC _ ODR _ ODR6#。 PC_CR2_C27=0; }#define SET_SDA_OUT_TM1650 () {PC_DDR_DDR6=1; PC_CR1_C16=1; PC_CR2_C26=0; }#define SET_SDA_IN_TM1650 () {PC_DDR_DDR6=0; PC_CR1_C16=0; PC_CR2_C26=0; }voidIIC_init_TM1650(void ); voidtDelay_us(u8z; voidI2c_start_TM1650(void ); VoidI2c_stop_TM1650(Void ); voidIIC_ack_TM1650(void; voidIIC_nack_TM1650(void; uint8_ tiic _ wait _ ack _ TM 1650 (void; void IIC _ wr byte _ TM 1650 (uint8_ ttxd; //U8Scan_Key(void ); voidTM1650_set(U8add,u8 dat ); voidinit_TM1650(void; #endif

以下是. c文件。

# include ' TM 1650 _ I2C.h '/--------------------------------------------------- - escription 3360-------------------escription 3360 ----------------------------------- - SCL_TM1650=1; SDA_TM1650=1; (() ) ) ) ) ) ) ) ) ) )。 --------------vook//fcpu8MHz时//for(I=50; i0; I----; wile(z----) { nop; nop (; nop (; nop (; -----------------------------------; escription 3360 start singnal---------------------------------------------------- ----------------------------------- - //先使数据线为高,开始信号在其端口下降沿时Tdelay_us(4); SCL_TM1650=1; //时钟线是highTdelay_us(40 ); 延迟约为//5us,具体取决于设备,SDA_TM1650=0; //在数据线的升降中出现下降的Tdelay_us(4); //延迟一点,保证可靠的下降

SCL_TM1650 = 0; //拉低时钟线,保证接下来数据线允许改变 }//--------------------------------------------------------------// Prototype : void I2C_Stop(void)// Calls : Delay_5us()// Description : Stop Singnal//-------------------------------------------------------------- void I2C_Stop_TM1650(void){ // SDA 0->1 while SCL High //SCL高电平期间,SDA产生一个上升沿 表示停止 SET_SDA_OUT_TM1650();SCL_TM1650 = 0;TDelay_us(2);SDA_TM1650 = 0;//保证数据线为低电平TDelay_us(40); SCL_TM1650 = 1;//先保证时钟线为高电平 TDelay_us(10); //延时 以得到一个可靠的电平信号 SDA_TM1650 = 1; //数据线出现上升沿 TDelay_us(40); //延时 保证一个可靠的高电平 }//应答函数void IIC_Ack_TM1650(void){ //数据线一直保持为低电平,时钟线出现上升沿即为应答SET_SDA_OUT_TM1650();TDelay_us(10); SDA_TM1650 = 0; TDelay_us(10); SCL_TM1650 = 0; TDelay_us(40);SCL_TM1650 = 1;TDelay_us(40); //应答完成后 将时钟线拉低 允许数据修改 SCL_TM1650 = 0;}//非应答void IIC_NAck_TM1650(void){ //非应答即相反 与应答区别即为数据线保持高电平即可SET_SDA_OUT_TM1650();TDelay_us(10); SDA_TM1650 = 1; TDelay_us(10);SCL_TM1650 = 0;TDelay_us(40); SCL_TM1650 = 1; TDelay_us(40); //最后要将时钟线拉低 允许数据变化 SCL_TM1650 = 0;}//等待应答uint8_t IIC_Wait_Ack_TM1650(void)//0为有应答,1为无应答{ //应答等待计数 uint8_t ackTime = 0; //先将数据线要设置成输入模式本程序未体现,有应答则会出现下降沿SCL_TM1650 = 0;SET_SDA_OUT_TM1650(); TDelay_us(10);SDA_TM1650 = 1;//TDelay_us(30);SET_SDA_IN_TM1650();//切换为输入模式 //时钟线拉高 SCL_TM1650 = 1; TDelay_us(30); //等待数据线拉低应答 while(SDAM_TM1650){ //如果在该时间内仍未拉低 ackTime ++; if(ackTime > 250) { //认为非应答 停止信号 I2C_Stop_TM1650(); return 1; } } SCL_TM1650 = 0; return 0 ;}void IIC_WrByte_TM1650(uint8_t txd){ //定义一个计数变量 uint8_t i;SET_SDA_OUT_TM1650(); //将时钟线拉低允许数据改变// SCL = 0; //按位发送数据 for(i = 0;i < 8; i ++) { TDelay_us(2); if((txd&0x80)>>7) //0x80 1000 0000SDA_TM1650=1;elseSDA_TM1650=0; txd<<=1; TDelay_us(20); SCL_TM1650=1;TDelay_us(20); SCL_TM1650=0;TDelay_us(20); }}/***************************u8 Scan_Key(void) //按键扫描{u8 i;u8 rekey;I2C_Start_TM1650();IIC_WrByte_TM1650(0x49);//读按键命令IIC_Ack_TM1650();//DIO_H;SET_SDA_IN_TM1650();//切换为输入模式for(i=0;i<8;i++){ SCL_TM1650=1; rekey = rekey<<1; if(SDAM_TM1650) { rekey++; } TDelay_us(5); SCL_TM1650=0;}IIC_Ack_TM1650();I2C_Stop_TM1650();return(rekey);}****************************/void TM1650_Set(u8 add,u8 dat) //数码管显示{//写显存必须从高地址开始写I2C_Start_TM1650();IIC_WrByte_TM1650(add); //第一个显存地址IIC_Ack_TM1650();IIC_WrByte_TM1650(dat);IIC_Ack_TM1650();I2C_Stop_TM1650();}void Init_Tm1650(void){IIC_Init_TM1650();delay_ms(50);//需要延时一小段时间,否则开显示会无响应TM1650_Set(0x48,0x31);//初始化为5级灰度,开显示}

注意:TM1650芯片启动可能需要一点时间,故发送开显示前应延时一小段时间,否则会收不到。

20200420更新:发现新版TM1650芯片按键部分遇到问题。

解决方法:新版本的晶圆有些因为方案设计会导致芯片振荡器打不开 所以要调一下指令。

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。