|
本帖最后由 springvirus 于 2024-3-8 11:31 编辑
玩玩STM8S103K3,结果没有想象中顺利,不过PB7和PB6的小灯最终还是按照程序控制的样子闪烁了,总结一下,给需要的童鞋们
使用官方的STVD开发编译环境,ST-LINK V2(支持STM32 STM8)+ STVP下载和读取 片内FLASH和片内EEPROM,以及OPTION BYTE
STM8是下载烧录编译后的HEX文件或者S19文件
EEPROM区比较好玩,可以直接敲入字符,然后烧入片子,当时也可以读取回来,也可以保存成HEX文件
----------------------------------------------------------------------------------------------------------------------------------
0. VCAP引脚必须焊接电容到GND,否则ST-LINK通过SWIM接口根本无法识别到目标STM8的片子!!!
我是焊接了贴片1uF电容到GND,就可以了,上电后,VCAP电压(内核电压)为1.8V左右
另外复位电路最好焊接,标准的阻容复位电路。
1. stm8_interrupt_vector.c 非常关键 !!! 必须要有此文件参与编译 !!!且其中内容不能屏蔽掉 !!!!!
因为其中包括中断向量表,位于8000H地址开始的地方
2. 通过SWIM接口烧录完毕后,要拔掉SWIM-RST线,程序才能运行 !!!!
3.不要使用stm8s_it.c,否则与stm8_interrupt_vector.c共存时, 编译报错,可以自己在main.c写中断函数+ 修改stm8_interrupt_vector.c,例如增加TIM4的溢出中断功能
main.c中加入以下:
@far @interrupt void TIM4_UPD_OVF_IRQHandler(void)
{
/* Cleat Interrupt Pending bit */
TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
}
stm8_interrupt_vector.c中修改后的内容如下:
typedef void @far (*interrupt_handler_t)(void);
struct interrupt_vector {
unsigned char interrupt_instruction;
interrupt_handler_t interrupt_handler;
};
@far @interrupt void NonHandledInterrupt (void)
{
/* in order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction
*/
return;
}
extern void _stext(); /* startup routine */
extern @far @interrupt void TIM4_UPD_OVF_IRQHandler(void); // -> 必须要有外部声明,否则编译报错 !!!!
struct interrupt_vector const _vectab[] = {
{0x82, (interrupt_handler_t)_stext}, /* reset */
{0x82, NonHandledInterrupt}, /* trap */
{0x82, NonHandledInterrupt}, /* irq0 */
{0x82, NonHandledInterrupt}, /* irq1 */
{0x82, NonHandledInterrupt}, /* irq2 */
{0x82, NonHandledInterrupt}, /* irq3 */
{0x82, NonHandledInterrupt}, /* irq4 */
{0x82, NonHandledInterrupt}, /* irq5 */
{0x82, NonHandledInterrupt}, /* irq6 */
{0x82, NonHandledInterrupt}, /* irq7 */
{0x82, NonHandledInterrupt}, /* irq8 */
{0x82, NonHandledInterrupt}, /* irq9 */
{0x82, NonHandledInterrupt}, /* irq10 */
{0x82, NonHandledInterrupt}, /* irq11 */
{0x82, NonHandledInterrupt}, /* irq12 */
{0x82, NonHandledInterrupt}, /* irq13 */
{0x82, NonHandledInterrupt}, /* irq14 */
{0x82, NonHandledInterrupt}, /* irq15 */
{0x82, NonHandledInterrupt}, /* irq16 */
{0x82, NonHandledInterrupt}, /* irq17 */
{0x82, NonHandledInterrupt}, /* irq18 */
{0x82, NonHandledInterrupt}, /* irq19 */
{0x82, NonHandledInterrupt}, /* irq20 */
{0x82, NonHandledInterrupt}, /* irq21 */
{0x82, NonHandledInterrupt}, /* irq22 */
{0x82, TIM4_UPD_OVF_IRQHandler}, /* irq23 */
{0x82, NonHandledInterrupt}, /* irq24 */
{0x82, NonHandledInterrupt}, /* irq25 */
{0x82, NonHandledInterrupt}, /* irq26 */
{0x82, NonHandledInterrupt}, /* irq27 */
{0x82, NonHandledInterrupt}, /* irq28 */
{0x82, NonHandledInterrupt}, /* irq29 */
};
4. main.c 要加入下段代码,否则编译例如stm8s_gpio.c时会报错
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval : None
*/
void assert_failed(u8* file, u32 line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif
5. 随便加了点代码,需要用到STM8S_TIM1.C STM8S_TIM2.C STM8S_TIM4.C
一编译,又NM报错 !!!!!!!!!!!
#error clnk Debug\stm8s103k3_led.lkf:1 segment .text size overflow (4624)
8KB 的FLASH,这就用完了 ????
解决方法:如下图设置再编译就可以了
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|