準備
STM8的編譯環境有兩種,一個是IAR,一個是ST官方提供的STVD+COSMIC.
由於IAR需要破解,我選擇了使用官方提供的環境STVD。
- STVD:IDE,可以從ST官網下載
- COSMIC: 編譯器,可以從它的官網下載。http://www.cosmic-software.com/download.php
- stm8_stdperiph_lib:標準庫,這個也可以從ST官網下載,不同型號的芯片對應不同的庫。有時候官網登不上不知道什麼原因。
之前在stm32上用慣了標準庫,所以,這次使用stm8也使用標準庫編程,這樣不需要太關注底層的寄存器。但是,標準庫並不太標準,有些坑,需要注意,後面會說到。
建立目錄
- cos: 放置編譯出來的相關文件
- lib: 放置標準庫。把標準庫中的inc和src拷貝過來
- src: 放置自己的業務程序文件,包括main.c。
另外,需要把標準庫中的stm8l10x_conf.h、stm8l10x_it.c、stm8l10x_it.h拷貝到src目錄下
配置
STVD安裝完成後,打開。跟其他keil等IDE沒有太多區別,都是大同小異的。
- 創建WorkSpace,Project
- 選擇編譯器,就是剛纔安裝好的COSMIC。
- 選擇IC型號
- 添加文件
編譯
編譯,然後保存關閉。這樣會在cos目錄下自動生成main.c和stm8_interrupt_vector.c。刪除該main.c文件,因爲在src下我們已經創建了。再次打開工程,會報個警告,找不到main.c,忽略。
直接編譯應該是會報錯的,重複定義NonHandledInterrupt。
註釋掉stm8_interrupt_vector.c中的該函數
#if 0
@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;
}
#endif
另外,包含頭文件stm8l10x_it.h
#include "stm8l10x_it.h"
這樣下來,基本的環境就搭建完成了。環境搭建可以參考:
https://wenku.baidu.com/view/87aade66b84ae45c3b358cc3.html
https://blog.csdn.net/sy_lixiang/article/details/8461829
內存
由於是八位單片機,很多東西跟32位的不太一樣,需要注意的。
第一個需要注意的是內存。看完這兩篇文章就清楚了:
https://blog.csdn.net/sygdp21/article/details/17420393
https://blog.csdn.net/dongganxiao_maidou/article/details/73775533
GPIO
stm8l101的標準庫中gpio的操作中有bug
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, BitAction GPIO_BitVal)
{
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
assert_param(IS_STATE_VALUE(GPIO_BitVal));
if (GPIO_BitVal != RESET)
{
//SetBit(GPIOx->ODR, GPIO_Pin);//BUG語句,GPIO_Pin是按位來定義的,卻被SetBit以字節來操作。
GPIOx->ODR |= GPIO_Pin;
}
else
{
//ClrBit(GPIOx->ODR, GPIO_Pin);//BUG語句,GPIO_Pin是按位來定義的,卻被SetBit以字節來操作。
GPIOx->ODR &= (uint8_t)(~GPIO_Pin);
}
}
具體可以參考
https://blog.csdn.net/feilusia/article/details/53209672
最後,感謝這些博主的無私奉獻。希望自己也可以在這兒盡一份微薄之力。