stm8 点亮第一个LED

第一步:配置时钟

上一讲的程序点亮LED灯并没有设置stm8的时钟,但是LED灯依然可以正常闪烁。为使系统快速启动,复位后时钟控制器自动使用HSI8分频(HSI/8)做为主时钟。因为HSI的稳定时间短,而8分频可保证系统在较差的VDD条件下安全启动。

一旦主时钟源稳定,用户程序可将主时钟切换到另外的时钟源。


果然一个厂家的,和stm32差不多。

stm8主时钟有四种时钟源:

● 1-24MHz高速外部晶体振荡器(HSE)
● 最大24MHz高速外部时钟信号(HSE user-ext)
● 16MHz高速内部RC振荡器(HSI)
● 128KHz低速内部RC(LSI)
各个时钟源可单独打开或关闭,从而优化功耗。

时钟相关寄存器:

 


内部时钟寄存器CLK_ICKR中的标志位HSIRDY用以指示HSI RC是否稳定。启动时, HSI时钟信号将不会生效直至此标志位被硬件置位。
HSI RC可通过设置内部时钟寄存器CLK_ICKR中的HSIEN位打开或关闭。

 


void System_Init(void)
{
   CLK_SWR = 0xE1;          //选择高速内部时钟HSI为主时钟 可不要这话
   CLK_ICKR |= 0x01;          //高速内部HSI时钟使能
   while(!(CLK_ICKR&0x03));   //等待内部高速HSI就绪
   CLK_CKDIVR = 0x18;       // Fhsi = Fhsi = Fcpu = Fmaster = 2MHz
}

这里是选择HSI 8分频后作为系统主时钟。

第二步:配置GPIO

通用输入/输出口用于芯片和外部进行数据传输。一个IO端口可以包括多达8个引脚,每个引脚可以被独立编程作为数字输入或者数字输出口。另外部分口还可能会有如模拟输入,外部中断,片上外设的输入/输出等复用功能。但是在同一时刻仅有一个复用功能可以映射到引脚上。复用功能的映射是通过选项字节控制的。请参考数据手册关于选项字节的描述。每个端口都分配有一个输出数据寄存器,一个输入引脚寄存器,一个数据方向寄存器,一个选择寄存器,和一个配置寄存器。一个I/O口工作在输入还是输出是取决于该口的数据方向寄存器。

每一个端口都有一个输出数据寄存器 (ODR),一个引脚输入寄存器 (IDR)和一个数据方向寄存器(DDR) 总是同相关的。控制寄存器1(CR1)和控制寄存器2(CR2)用于对输入/输出进行配置。

任何一个I/O引脚可以通过对DDR,ODR,CR1 和CR2寄存器的相应位进行编程来配置。

寄存器中的位n对应于口的引脚 n 。

 



设置PE5为推挽输出,最大速度10MHZ

void Gpio_Init(void)
{
  PE_DDR |= 0x20;  //PE5设置为输出
  PE_CR1 |= 0x20;  //PE5设置为推挽输出
  PE_CR2 |= 0x20;  //最大输出速度10MHz
}

至此关于stm8的时钟和LED连接的GPIO口配置完毕,就可以开始写主函数了。

int main( void )
{
  int i,j;
  System_Init();           //初始化系统时钟
  Gpio_Init();             //PE5的GPIO口初始化
  while (1)
  {
    PE_ODR ^= 0x20;     //PE5取反
    for(i=0;i<100;i++)     //延时
      for(j=0;j<1000;j++);
  }
}

最后编译--下载仿真,按下键盘F5健,LED灯开始闪烁了,那么成功点亮第一个LED 


 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的STM32点亮第一个LED灯的程序: 1. 首先,需要在STM32的开发环境中创建一个工程,并将工程名设置为“LED_Blink”。 2. 然后,需要在工程中添加一个源文件,命名为“main.c”。 3. 在“main.c”文件中,需要包含以下头文件: ``` #include "stm32f10x.h" ``` 4. 在“main.c”文件中,需要定义一个函数来初始化GPIO端口,以便控制LED灯的亮灭。以下是初始化GPIO端口的函数: ``` void GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); } ``` 5. 在“main.c”文件中,需要定义一个函数来控制LED灯的亮灭。以下是控制LED灯的亮灭的函数: ``` void LED_Blink(void) { while (1) { GPIO_SetBits(GPIOC, GPIO_Pin_13); Delay(1000000); GPIO_ResetBits(GPIOC, GPIO_Pin_13); Delay(1000000); } } ``` 6. 在“main.c”文件中,需要定义一个函数来实现延时。以下是实现延时的函数: ``` void Delay(__IO uint32_t nCount) { while(nCount--) { } } ``` 7. 最后,在“main.c”文件中,需要定义一个主函数,并在主函数中调用以上三个函数。以下是主函数的代码: ``` int main(void) { GPIO_Init(); LED_Blink(); } ``` 以上就是一个简单的STM32点亮第一个LED灯的程序。需要注意的是,针脚号和其他硬件配置可能会因不同的开发板而有所不同,需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值