关于野火嵌入式指南者开发板中用寄存器来操作RGB灯的笔记以及出现的问题

硬件:首先在硬件中我们看到了RGB灯的硬件电路图
在这里插入图片描述
现在我们用寄存器的方法来操作这几个灯:
1,先定义硬件的宏

#define	GPIOB_CRL	0x40010C00
#define GPIOB_ODR	0x40010C0C
#define RCC_APB2NER 0x40021018   //在这里我们打开了内部的时钟并且定义了硬件的地址
#define GPIOB_BSRR  0x40021010

//我们现在在函数中配置寄存器, 先让RGB亮绿灯,
//现在打开内部时钟,配置为输出模式,并且输出速率为50Mhz
	*((unsigned int *)RCC_APB2NER) =    0x00000008;
//现在配置GPIOB_CRL寄存器、因为我的引脚是0、1、5,所以我配置CRL就可以了
	*((unsigned int *)GPIOB_CRL)   =    0x00003333;
//现在我用GPIOB_ODR寄存器来操作输出引脚的电平
//从电路图中可知,操作RGB等是低电平有效,要想操作
//寄存器使绿灯发光,应该配置寄存器为如下
	*((unsigned int *)GPIOB_ODR)   =    0x0000000E;
	

现在我们看得到了绿灯的亮灯效果

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,针对您的问题,我来给您讲解如何在野火指南开发板上实现这个秒表程序。 野火指南开发板是基于STM32F103RCT6芯片设计的,因此我们可以使用与前面代码类似的方法在开发板上实现这个程序。下面是大致的步骤: 1. 硬件连接 将开发板的LCD屏幕连接到相应的引脚上。野火指南开发板的LCD屏幕接口与标准的HD44780接口不同,需要使用特定的库文件进行操作。具体的接线方式可以参考野火指南开发板的官方文档。 2. 创建工程 在Keil5中创建一个新工程,选择适用于STM32F103芯片的模板,然后进行一些基本的配置,如设置系统时钟等。 3. 编写程序 根据前面的代码,在main函数中添加如下代码: ``` int main(void) { // 初始化系统时钟,定时器和GPIO等相关硬件 RCC_Configuration(); GPIO_Configuration(); TIM_Configuration(); // 启动定时器 TIM_Cmd(TIM2, ENABLE); // 启用定时器中断 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 启用全局中断 NVIC_EnableIRQ(TIM2_IRQn); while (1) {} } ``` 其中,RCC_Configuration()、GPIO_Configuration()和TIM_Configuration()是初始化系统时钟、GPIO和定时器的函数,需要根据具体的硬件和接口进行修改。启用定时器中断和全局中断的代码与前面的代码相同。 需要注意的是,野火指南开发板的定时器2默认使用的是APB1总线,因此需要将定时器时钟配置为APB1总线的2倍,即84MHz。具体的代码如下: ``` void TIM_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 使能定时器2的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 设置定时器2的参数 TIM_TimeBaseStructure.TIM_Period = 83999; // 定时器周期为1s TIM_TimeBaseStructure.TIM_Prescaler = 999; // 时钟分频系数为1000 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 清除定时器2的中断标志位 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } ``` 4. 编写LCD显示函数 野火指南开发板的LCD屏幕需要使用特定的库文件进行操作。在Keil5中,可以通过添加库文件的方式使用这些库函数。具体的使用方法可以参考野火指南开发板的官方文档。这里我们假设已经添加了相应的库文件,并编写了如下的LCD显示函数: ``` void LCD_ShowString(uint16_t x, uint16_t y, uint8_t *str) { uint16_t i = 0; while (str[i]) { LCD_ShowChar(x, y, str[i]); x += 8; i++; } } ``` 该函数可以在指定的位置显示一个字符串。需要注意的是,因为野火指南开发板的LCD屏幕分辨率较小,因此需要根据具体的情况调整字符串的位置和长度。 5. 定时器中断服务函数 野火指南开发板的定时器中断服务函数可以按照前面的代码进行编写。需要注意的是,在定时器中断服务函数中调用LCD显示函数时,需要根据具体的情况设置字符串的位置和长度。下面是一个简单的定时器中断服务函数示例: ``` void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { // 清除定时器中断标志位 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 计时器计数值加1 tick++; // 每1000次计数更新一次秒表 if (tick % 1000 == 0) { counter++; uint8_t str[16]; sprintf((char *)str, "%02d:%02d.%03d", counter / 60000, (counter % 60000) / 1000, counter % 1000); LCD_ShowString(0, 0, str); } } } ``` 6. 编译和下载程序 完成以上步骤后,可以编译程序并下载到野火指南开发板中。需要注意的是,下载程序之前需要将开发板连接到电脑上,并确保开发板的驱动程序已经正确安装。 希望这些步骤可以帮助您在野火指南开发板上实现这个秒表程序!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值