IAR 开发STM8 学习

2019-04-15 17:02发布


刚刚接触STM8单片机,之前一直在Linux下开发,一时有点懵逼了,于是把自己的一些学习过程记录下来,希望对与像我这样的门外汉有所帮助。

1、安装IAR软件: 百度一下,一大堆的安装教程, 我安装了2.0以上的版本,需要license,我用注册机生成的注册码填进去,一直提示注册码无效, 没办法使用,最后只能安装 1.42版本的IAR,(安装时记得安装ST-LINK驱动);
2、在IAR中创新工程:project->create new project  然后选择模板, 我选择的是C模板,点击OK, 就会生成一个main.c文件及main函数;

3、把库文件拷贝到工程目录下,(这里我拷贝Libraries 、 Utilities) 4、配置工程信息: 鼠标放到工程名上,点击右键弹出如下:

点击Options...,弹出如下配置界面:
5、以下简单的说明一下一些配置,具体的配置还是需要根据自己的实际情况来配置: a、general option 的Library Options 中的printf 和scanf 一定要选择 small 不然代码里面使用printf函数时,编译会提示如下错误,这个错误让我郁闷里很久才找出原因:

b、C/C++ compiler 选项,选择C编译器,c99标准,preprocessor配置说明如下:
c、因为采用的是ST-LINK调试,所以debugger选项的配置如下:

其他的选项可以根据自己的需求配置,因为我的项目比价简单所以就没有配置其他选项。
程序实现串口打印:
#include "stm8l15x.h"
#include "stdio.h"
#include "stm8_eval.h"
#include "stm8l15x_beep.h"
#include "delay.h"


#ifdef _RAISONANCE_
#define PUTCHAR_PROTOTYPE int putchar (char c)
#define GETCHAR_PROTOTYPE int getchar (void)
#elif defined (_COSMIC_)
#define PUTCHAR_PROTOTYPE char putchar (char c)
#define GETCHAR_PROTOTYPE char getchar (void)
#else /* _IAR_ */
#define PUTCHAR_PROTOTYPE int putchar (int c)
#define GETCHAR_PROTOTYPE int getchar (void)
#endif /* _RAISONANCE_ */

/************************************************************************************
  * @brief Retargets the C library printf function to the USART.
  * @param[in] c Character to send
  * @retval char Character sent
  * @par Required preconditions:
  * - None
 ************************************************************************************/
PUTCHAR_PROTOTYPE
{
  /* Write a character to the USART */
  USART_SendData8(EVAL_COM1, c);
  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET);

  return (c);  
}


/************************************************************************************
  * @brief Retargets the C library scanf function to the USART.
  * @param[in] None
  * @retval char Character to Read
  * @par Required preconditions:
  * - None
 ************************************************************************************/
GETCHAR_PROTOTYPE
{
  int c = 0;
  /* Loop until the Read data register flag is SET */
  while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_RXNE) == RESET);
   
  c = USART_ReceiveData8(EVAL_COM1);
  return (c);
}

/**************************************************************************
*  name: systemClockInit
*  param:
*    int:  NULL
*    out:  NULL
*  return: NULL
*  function: config systrm clock frequency
***************************************************************************/
void SystemClockInit(void)
{
  CLK_SYSCLKSourceSwitchCmd(ENABLE);// Select HSE as system clock source
  CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);
  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_4); // system clock prescaler: 4
  while(CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSI)
  {
  }
 
}
/**************************************************************************
*  name: UsartInit
*  param:
*    int:  NULL
*    out:  NULL
*  return: NULL
*  function: config and init uart
***************************************************************************/
void UsartInit(void)
{
  SYSCFG_REMAPDeInit();
  SYSCFG_REMAPPinConfig(REMAP_Pin_USART1TxRxPortC, ENABLE);    
  STM_EVAL_COMInit(COM1, (uint32_t)115200, USART_WordLength_8b, USART_StopBits_1,     
                  USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Tx | USART_Mode_Rx));
 
  enableInterrupts();
}
/**************************************************************************
*  name: mian
*  param:
*    int:  NULL
*    out:  NULL
*  return: 0
*  function: program entry
***************************************************************************/
int main( void )
{
 
  SystemClockInit();
  UsartInit();
 
  while(1)
  {
      printf("hello world ");
      delay_ms(500);
  }
 
}
实用ST-LINK连接板和PC机, 然后连接好串口;

到这里,一个简单的STM8单片机程序就搞定了