经过小弟的一个周末的努力,终于发现STM8S不能块编程的原因了。首先STM8S的块编程,需要把程序放在RAM中运行。对于像我这样没学过汇编的,也不了解编译器原理的,只知道用C语言写写程序的朋友。有点摸不着头脑。那么如何让程序在RAM中运行呢? 我们看下STM8S的库函数数就知道了。下面是库函数的代码。 IN_RAM(void FLASH_EraseBlock(uint16_t BlockNum, FLASH_MemType_TypeDef FLASH_MemType)); 我刚开始就被这个函数定义给骗了。以为加了IN_RAM( ),就可以在RAM中运行了。我们看下 IN_RAM() 的定义 #define IN_RAM(a) a 在默认情况下,它什么都没干。仔细一下,在默认情况下,是不库函数把在RAM中运行程序的功能给屏蔽了。 /* Uncomment the line below to enable the FLASH functions execution from RAM */ #if !defined (RAM_EXECUTION) /*#define RAM_EXECUTION (1) */ #endif /* RAM_EXECUTION */ 取消掉这个注释就可以了。把它变成 /* Uncomment the line below to enable the FLASH functions execution from RAM */ #if !defined (RAM_EXECUTION) #define RAM_EXECUTION (1) #endif /* RAM_EXECUTION */ 这样IN_RAM()的定义就变成了 #define IN_RAM(a) __ramfunc a 再去调试程序。就好了。 自己写程序其实就是在函数前面加下 __ramfunc 下面是我测试成功的程序 uint8_t block_buff[128]; __ramfunc void WriteBlock(void) { uint8_t i; FLASH_Unlock(FLASH_MEMTYPE_DATA); FLASH->CR2 |= FLASH_CR2_PRG; FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NPRG); for(i=0; i<128; i++) { *((PointerAttr uint8_t*) (MemoryAddressCast)0x4000 + i) = block_buff[i]; } FLASH_Lock(FLASH_MEMTYPE_DATA); } 祝还不会块编程的朋友们好运!!!!! 但是看门狗我还不知道原因。在接上STLINK调试的时候,看门狗会死机,但是在程序自己运行时,它就正常了 |
求一个STM8S207例程
初次接触STM8,请问在STVD中,为什么这个Struct会报错
STMS005K6T6 如何采集内部参考电压。
stm8s003 adc中断和通道切换的问题
adc施密特触发器stm8
stm8l051f3 TSSOP20 封装,待机模式下,2天后,电流突然增加到140UA
STM8S用STVP烧录怎么加密?
如何使用ST官网例程_LIN总线通讯_STM8AF
STM8 LIN
IAR代码编辑太费劲了,想问一下有没有好的方法,试了VScode但是头文件老是报错,调了很久也没调好,想换个方法了。
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include "stm8s.h"
#include <stdio.h>
int _fctcpy(char name);
main()
{
u8 block_buff[128] ={0};
u8 i = 0;
u8 c = 0;
_fctcpy('F');
CLK_DeInit();
CLK_HSICmd(ENABLE);
CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);
UART1_DeInit();
UART1_Init((u32)115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,
UART1_SYNCMODE_CLOCK_DISABLE,UART1_MODE_TXRX_ENABLE);
UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
UART1_Cmd(ENABLE);
GPIO_DeInit(GPIOD);
GPIO_Init(GPIOD, GPIO_PIN_LNIB, GPIO_MODE_OUT_PP_LOW_FAST);
for(i=0;i<128;i++)
block_buff=i;
FLASH_DeInit();
FLASH_Unlock(FLASH_MEMTYPE_DATA);
FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_TPROG);
FLASH_ProgramBlock(0x0001, FLASH_MEMTYPE_DATA, FLASH_PROGRAMMODE_STANDARD, block_buff);
FLASH_EraseBlock(0x0001, FLASH_MEMTYPE_DATA);
c = FLASH_ReadByte(0x40ff);//读出值到变量中
printf("c=%x\r\n",(u16)c);//打印
c = FLASH_ReadByte(0x407f);
printf("c=%x\r\n",(u16)c);
c = FLASH_ReadByte(0x4080);
printf("c=%x\r\n",(u16)c);
c = FLASH_ReadByte(0x4100);
printf("c=%x\r\n",(u16)c);
_asm("rim");
while (1)
{
GPIO_WriteHigh(GPIOD, GPIO_PIN_LNIB);
}
}
char putchar (char c) //串口打印重定向,只要有这个函数,然后包含stdio.h就可以直接调用打印函数了,若有不成功时请把参数前强转为(u16)
{
if (c == '\n')
{
/* put '\r' to hardware here */
/* Wait transmission is completed : otherwise the first data is not sent */
while (!(UART1->SR & 0x40));
UART1->DR = ('\r');
/* Wait transmission is completed */
while (!(UART1->SR & 0x40));
}
/* put c to hardware here */
/* Wait transmission is completed : otherwise the first data is not sent */
while (!(UART1->SR & 0x80));
UART1->DR = (c);
/* Wait transmission is completed */
while (!(UART1->SR & 0x80));
return (c);
}