提升自信最有效的方式——实践

  • 前言
  • 一、材料的准备
  • 二、制作步骤
    • 1.cubemx的搭建
    • 2.硬件焊接
    • 3.代码编写
  • 总结

前言

谈到STM32的学习路程,对于初学者,往往最困难的是要学会爱上它。当你花费几个月熟悉并学会运用c(python),然后就要了解单片机的基础知识,又要花费几个月的时间,(毕竟这都是闲暇时间的消遣不是、、、)下一步再去学习标准库的使用也好,cubemx的自动生成也罢,初始的知识积累实在是过于枯燥。这就和谈恋爱一样,谁喜欢没有回报的付出呢?在经过几个月甚至一年的理论摧残后,你就会萌生这样一种想法:爷上课都不听,凭什么让我学这些东西,我就只是想点个灯玩玩啊!…(当然,课程还是要好好听的,毕竟咱们叫“大学生”…)所以,在此,我认为给大家提供一个“点灯”具体的过程是很有必要的,但我们怎又甘心在数月的理论学习之后点一个灯呢?所以我选择了一个台式时钟的制作来让同学们提升信心。我相信,在你耐心看完这篇文章,并试着一步步做下来以后,数码管亮起的一刹那你会有爱上它的感觉。
**注意!!!**本篇文章较长,旨在让白中白体会电子制作的全过程及其中的乐趣,相关有需要同学可以根据自身情况跳跃观看


一、材料的准备

硬件
  STM32F103C8T6
  TM1637数码管(或LED)
  洞洞板
  飞线
  100k电位器
  按键
软件
  keil5
  Cubemx

二、制作步骤

1.cubemx的搭建

配置IO口时钟树的配置
文件配置

2.硬件焊接

电路图就像下面这样,这里是单用芯片画的,不过和模块对应引脚名称是一样的,对应连就可以。
焊接好以后大概就是这样的
背面就不放图了(肯定不是因为我用的不是专业飞线,实在是太丑了,不好意思放图)大家可以飞线或走锡(走锡的话最好不要选择我这种两面焊盘贯通的洞洞板,否则不容易走锡连线)。到这里,就可以有所发挥了,我这里数码管用来显示小时和分钟,两侧二极管显示秒,大家可以尝试全用数码管显示,甚至可以用点阵滚动显示,都是比较简单的显示方式。大家还可以连接按键,来进行调时。

3.代码编写

主体代码如下:

#include "main.h"
#include "tim.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
static uint8_t fac_us=0;/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
int nums1=0    ;       int nums2=0    ;
int numm1=0    ;       int numm2=0    ;
int numh1=0    ;       int numh2=0    ;void Error_Handler(void);
void SystemClock_Config(void);
void ALIX_Delay_init(void);
void ALIX_Delay_us(uint32_t nus);
void TMserialstart(void);
void TMserialstop(void);
void TMserialask(void);
void TMserialWrByte(uint8_t oneByte);
void TMSegDisplay(uint8_t *DISCODE);int main(void)
{uint8_t TubeTab0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};uint8_t e[]={TubeTab0[numm2],TubeTab0[numm1],TubeTab0[nums2],TubeTab0[nums1]};HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_TIM1_Init();HAL_TIM_Base_Start_IT((TIM_HandleTypeDef *)&htim1);ALIX_Delay_init();while (1){e[0] = TubeTab0[numm2];e[1] = TubeTab0[numm1];e[2] = TubeTab0[nums2];e[3] = TubeTab0[nums1];TMSegDisplay(e);}
}void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 */void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{nums1++;if(nums1==10)      {nums1=0;nums2++;}if(nums2==6)         {nums2=0;numm1++;}if(numm1==10)        {numm1=0;numm2++;}if(numm2==6)     {numm2=0;numh1++;}if(numh1==10)        {numh1=0;numh2++;}if(numh2==3)     {numh2=0;}
//  HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);
}void TMserialstart(void)
{HAL_GPIO_WritePin(TM_CLK_GPIO_Port,TM_CLK_Pin,GPIO_PIN_SET); // CLK = 1HAL_GPIO_WritePin(TM_DIO_GPIO_Port,TM_DIO_Pin,GPIO_PIN_SET); // DIO = 1ALIX_Delay_us(2);HAL_GPIO_WritePin(TM_DIO_GPIO_Port,TM_DIO_Pin,GPIO_PIN_RESET); // DIO = 0
}void TMserialstop(void)
{HAL_GPIO_WritePin(TM_CLK_GPIO_Port,TM_CLK_Pin,GPIO_PIN_RESET); // CLK = 0ALIX_Delay_us(2);HAL_GPIO_WritePin(TM_DIO_GPIO_Port,TM_DIO_Pin,GPIO_PIN_RESET); // DIO = 0ALIX_Delay_us(2);HAL_GPIO_WritePin(TM_CLK_GPIO_Port,TM_CLK_Pin,GPIO_PIN_SET); // CLK = 1ALIX_Delay_us(2);HAL_GPIO_WritePin(TM_DIO_GPIO_Port,TM_DIO_Pin,GPIO_PIN_SET); // DIO = 1
}void TMserialask(void)
{TM1637_DIO_IN();HAL_GPIO_WritePin(TM_CLK_GPIO_Port,TM_CLK_Pin,GPIO_PIN_RESET); // CLK = 0ALIX_Delay_us(5);while(HAL_GPIO_ReadPin(TM_DIO_GPIO_Port,TM_DIO_Pin));HAL_GPIO_WritePin(TM_CLK_GPIO_Port,TM_CLK_Pin,GPIO_PIN_SET); // CLK = 1ALIX_Delay_us(2);HAL_GPIO_WritePin(TM_CLK_GPIO_Port,TM_CLK_Pin,GPIO_PIN_RESET); // CLK = 0TM1637_DIO_OUT();
}void TMserialWrByte(uint8_t oneByte)
{uint8_t i;for(i=0;i<8;i++){HAL_GPIO_WritePin(TM_CLK_GPIO_Port,TM_CLK_Pin,GPIO_PIN_RESET); // CLK = 0if(oneByte&0x01){HAL_GPIO_WritePin(TM_DIO_GPIO_Port,TM_DIO_Pin,GPIO_PIN_SET); // DIO = 1}else{HAL_GPIO_WritePin(TM_DIO_GPIO_Port,TM_DIO_Pin,GPIO_PIN_RESET); // DIO = 0}ALIX_Delay_us(3);oneByte=oneByte>>1;HAL_GPIO_WritePin(TM_CLK_GPIO_Port,TM_CLK_Pin,GPIO_PIN_SET); // CLK = 1ALIX_Delay_us(3);}
}void TMSegDisplay(uint8_t *DISCODE)
{uint8_t i;TMserialstart();TMserialWrByte(0x40);TMserialask();TMserialstop();TMserialstart();TMserialWrByte(0xc0);TMserialask();for(i=0;i<4;i++){TMserialWrByte(*(DISCODE+i));TMserialask();}TMserialstop();TMserialstart();TMserialWrByte(0x8f);TMserialask();TMserialstop();
}
void ALIX_Delay_init()
{HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);  fac_us=72000000/8000000;           /HERE!SystemCoreClock      }void ALIX_Delay_us(uint32_t nus)
{       uint32_t temp;           SysTick->LOAD=nus*fac_us;                               SysTick->VAL=0x00;                         SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;      do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; SysTick->VAL =0X00;
}

要注意,新加代码要写在begin和end之间的保护区里面,否则再次运行cubemx生成代码时会被抹除。


总结

电子学习的知识累积阶段确实容易使人感到枯燥,可是要始终坚信,现在的学习在未来都会有用武之地,在以后的某一天,你或许会突然感到心中碎片化的知识逐渐的有了强烈的联系,突然理解了拉普拉斯变换的实际意义,突然明白了线性代数对空间扭曲的效果,突然…
努力吧,敬你,敬自己。

STM32之提升迷之自信(时钟的制作)相关推荐

  1. 103、迷之自信,不是真的自信

    一.雷观 迷之自信,不是真的自信. 有客观事实依据,有完整靠谱的推理过程,这样得出的结论,才是真的靠谱. 有依据,有逻辑的自信,才是真的自信. 只要坚持的观点,没有完整的事实基础和推理过程,可能就要经 ...

  2. STM32学习总结(一)——时钟RCC

    系列文章目录 第一章 STM32学习总结(一)--时钟RCC 文章目录 目录 前言 二.STM32时钟树 1.时钟树 2.时钟源 3.时钟系统 三.STM32时钟配置 1.系统时钟配置 2.外设时钟配 ...

  3. 从迷之自信到逻辑自信(简版)

    从2012年开始工作,10多年了: 从2002年开始奋斗,20多年了. 回首这20年,感觉自己的成绩很有限,相比过往的勤奋努力. 时代因素也有,个人智商等先天性制约也存在,但是呢,我就特别想找到根,找 ...

  4. 基于stm32单片机多功能可调时钟闹钟万年历计时器闹铃提醒Proteus仿真(源码+仿真+原理图+PCB)

     资料编号:148 视频讲解: 148-基于stm32单片机多功能可调时钟闹钟万年历计时器闹铃提醒Proteus仿真(源码+仿真+原理图+PCB) 本设计采用stm32单片机作为主控,LCD1602显 ...

  5. Flashnbsp;AS3nbsp;学习9nbsp;-nbsp;时钟的制作

    时钟的制作 制作好钟面及指针,时针,分针,秒针均为MC,注册点在底部正中,实例名称分别为sz_mc,fz_mc,mz_mc  年月日星期共4个动态文本框,实例名称分别为:y_txt,m_txt,d_t ...

  6. Ventuz教程学习笔记动手实践之时钟动画制作

    一.设计结果展示 用Ventuz制作时钟动画打算达到的效果,见下图.按A键动态出现时钟,按B键时钟从右侧划出. 二.从零开始 1.首先是制作时钟,分表盘和表针. 先新建一个Scene,然后拖动worl ...

  7. 【STM32】STM32f4学习之路--时钟

    文章目录 初学STM32,发现他的时钟系统有点复杂(相对于之前学的51单片机来说).这是为什么? –51单片机的I/O口少,外设简单,所以时钟一般来说都是固定的,这也导致了51单片机应用场景的局限性. ...

  8. stm32程序怎么设置apb2总线时钟_stm32学习笔记

    整理了一些STM32相关知识点,平时有空可以看看,如果是面试STM32相关工作的也可以看看.相信对你一定会有所帮助的. 1.AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2&g ...

  9. stm32时钟树_STM32中的时钟

    时序在数字电路中的作用,就像通信中用到的载波,载波并不起眼,但是很重要.时钟也一样,现象上只是某种频率波峰波谷跳动,一成不变.但是有了它,就像人类的历史有了时间轴一样,什么时候该干什么事才有了可能.程 ...

  10. STM32入门笔记(03):系统时钟控制 RCC (STM32CubeMx 初始化配置)

    目的/起源: B站@立邦大侠 的在视频里面提到,他用STM32CubeMx 更清晰地进行STM32系统时钟配置以及时钟架构. STM32 开发流程 : 芯片选型 - 原理图设计 - PCBlayout ...

最新文章

  1. 删除链表中全部值为k的节点
  2. Visual Studio 智能提示功能消失解决办法
  3. OpenGL样板程序,会转动的正方形
  4. 开发项目之考研计划_软件测试之项目测试计划模板
  5. 【Git、GitHub、GitLab】四 Git文件重命名的简单方法以及使用git log查看版本演变历史
  6. windows 程序设计及API
  7. 递归神经网络(Recursive Neural Network, RNN)
  8. 办公搜索利器UTOOLS-基于EVERYTHING的文件快速搜索软件
  9. excel 复选框 制作动态表格
  10. 8.TypeScript入门之TS类型声明文件
  11. bzoj2794 [Poi2012]Cloakroom ( 背包DP+离线 )
  12. NSIS “Win32 Error,Code:740 ,请求的操作需要提升”错误解决方法
  13. 【我的架构师之路】- golang源码分析之channel的底层实现
  14. win10中conda activate激活环境出错的解决办法
  15. java_vinson_02:jdk下载安装
  16. 手机二维码~~~ZXing简介
  17. day 09文件处理
  18. go 库 viper 配置解析神器
  19. 英读廊——艺术家、穷人和音乐家之10美元的奇异之旅(The Artist, the Poor Man, and the Musician)
  20. C++ 文件的随机读写

热门文章

  1. 最流行的 .NET 反编译工具合集
  2. 【OR】YALMIP 含参数规划
  3. 统信UOS系统怎么下载QQ音乐
  4. 查看U盘是USB2.0还是USB3.0
  5. 【嵌入式模块】再探ESP8266,保姆级教程
  6. 信息学奥赛一本通2061
  7. 【IDEA主题极致优化】全面优提升你的编码体验
  8. 项目启动时,出现了Consider defining a bean of type ‘xxx’ in your configuration 问题。
  9. PPT炫酷英文字体设置之Centaur
  10. RTMP直播推流Video(视频)