精华内容
下载资源
问答
  • stm32外围电路
    万次阅读 多人点赞
    2021-10-16 21:40:43

    【 声明:版权所有,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        在立创开源硬件平台上面,stm32可以说是使用最多的mcu芯片。它的核心是arm core。一方面,工业上比较认可stm32,另外一方面,我们也不得不承认意法半导体在校园推广mcu方面确实做的很好。当然,目前芯片普遍比较紧俏,之前便宜的几块钱的stm32,都要几十甚至上百了,这已经是后话了。

        stm32用的比较多的stm32f103、stm32f3、stm32f4这些。现在,除了上面说的这些,又出现了stm32f7系列,就我的认知来说,目前用的还不多。目前,stm32多用在工业上,电机、仪表、运动控制、采集方面,都有很多的应用场景。

        此外,stm32还容易使用rtos,在一些实时要求比较高的地方,用它是非常方便的。很多时候,除了实时控制,还需要人机交互,所以这个时候,stm32旁边还会搭配一个linux soc,这都是很正常的现象。当然,要是遇到图像处理方面的内容,或者并发要求比较多的场合,stm32配合fpga,也不是很稀奇的情况。当然,用了rtos也不代表stm32就是实时控制了,这个等有机会再说。

        为了说明stm32的最小电路,可以找一个电路图来学习下。比如这,https://oshwhub

    更多相关内容
  • STM32外围电路硬件解析

    千次阅读 2022-06-04 18:42:33
    复位 :让MCU回到最开始的状态。并且从头开始,重新执行程序 我们什么时候需要复位? 1.烧录的时候 2.程序跑飞了的时候 3.... 复位方式: 1.... MCU的Reset是复位引脚,当这个引脚为低电平时,

    复位电路:

            复位 :让MCU回到最开始的状态。并且从头开始,重新执行程序
            
            我们什么时候需要复位?
                        1.烧录的时候   

                        2.程序跑飞了的时候

                        3.上电复位(上电的时候需要复位)
                
            复位方式:
                1.上电复位: --- 一定要有
                    MCU的Reset是复位引脚,当这个引脚为低电平时,单片机会产生复位。              

                2. 按键复位:--- 可有可无(看需求)
                    K10按下,产生复位动作

     

             这是阻容复位电路。当复位引脚低电平的时候复位。当上电的瞬间,C13电容开始充电,电容处于短路状态,电容上面的电压为低电平,此时MCU复位引脚被拉低,MCU执行复位,这样就实现了上电的时候复位功能了。

            实际上,单片机内部也有上电复位电路,那么我们之所以还要在单片机外部加上复位电路的原因是:因为外部上电复位电路复位时间较长,较长的复位时间,可以使得等电源、系统充分稳定后,MCU再来启动并执行程序,保证了MCU、系统正常运行。

            注意:由于电容的精度不够,而且电容还会受到温度的影响,存在温漂,所以阻容复位电路的延时并不精确。但是,阻容复位电路可以满足绝大部分的需要了。

            上电复位的目的:

            1.等待供电电源、系统稳定后,再来启动MCU,执行程序,否则MCU、系统无法正常运行。

            2.复位会初始化部分寄存器

             注意R21和C13的选择(一般选择10k电阻,104电容就可以,即:延时大约10uS)。其中,电容不能选择太小,否则C13电容很快就充满电了,那么此时电容上面就不是低电平了,但是,很有可能此时电源、系统还没有到达稳定状态。那么芯片供电电源、系统不稳定,就会导致MCU和整个系统工作有问题,有可能MCU时而启动成功,时而启动失败。

     晶振电路:

            

            单片机内部集成的HSI时钟源是就是RC振荡器。

     

            晶振电路在布线的时候,尽量靠近单片机,因为晶振引脚,PCB走线也有电容电阻效应。

     

    晶体振荡器分为无源晶振有源晶振两种类型。

    无源晶振:

            无源晶振与有源晶振的英文名称不同,无源晶振为 crystal(晶体),而有源晶振则叫做 oscillator(振荡器)。

            无源晶振是有2个引脚的无极性元件,需要借助于时钟电路才能产生振荡信号,自身无法振荡起来,所以“无源晶振”这个说法并不准确;有源晶振有 4只引脚,是一个完整的振荡器,其中除了石英晶体外,还有晶体管和阻容元件,因此体积较大。

            无源晶振和有源晶振的区别很多时候是大家直接通过观察了解到的 。尤其是针对 2520贴片晶振,3225贴片晶振, 5032贴片晶振 ,并且是四脚封装的石英晶振来说, 包括有源晶振,也包括无源晶振。

    有源晶振

            有源晶振通常的用法:一脚悬空,二脚接地,三脚接输出,四脚接电压。

            有源晶振不需要DSP的内部振荡器,信号质量好,比较稳定,而且连接方式相对简单(主要是做好电源滤波,通常使用一个电容和电感构成的 PI 型滤波网络,输出 端用一个小阻值的电阻过滤信号即可),不需要复杂的配置电路。相对于无源晶体,有源晶振的缺陷是其信号电平是固定的,需要选择好合适输出电平,灵活性较 差,而且价格高。

            有源晶振是由石英晶体组成的,石英晶片之所以能当为振荡器使用,是基于它的压电效应:在晶片的两个极上加一电场,会使晶体产生机械变形;在石英晶片上加上 交 变电压,晶体就会产生机械振动,同时机械变形振动又会产生交变电场,虽然这种交变电场的电压极其微弱,但其振动频率是十分稳定的。

            当外加交变电压的频率与 晶片的固有频率(由晶片的尺寸和形状决定)相等时,机械振动的幅度将急剧增加,这种现象称为“压电谐振”。

            压电谐振状态的建立和维持都必须借助于振荡器电路才能实现。图 3 是一个串联型振荡器,晶体管 T1 和 T2 构成的两级放大器,石英晶体 XT 与电容 C2 构成 LC 电 路。在这个电路中,石英晶体相当于一个电感,C2 为可变电容器,调节其容量即可使电路进入谐振状态。该振荡器供电电压为 5V,输出波形为方波。

    晶振电路中选择电容的方式有哪些?-面包板社区导读:在电子学上,通常将含有晶体管元件的电路称作“有源电路”(如有源音箱、有源滤波器等),而仅由阻容元件组成的电路称作“无源电路”。https://www.eet-china.com/mp/a31010.html#:~:text=%E6%99%B6%E6%8C%AF%E7%94%B5%E8%B7%AF%E4%B8%AD%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9%E7%94%B5%E5%AE%B9%20C1%EF%BC%8CC2%EF%BC%9F%20%EF%BC%881%EF%BC%89%E5%9B%A0%E4%B8%BA%E6%AF%8F%E4%B8%80%E7%A7%8D%E6%99%B6%E6%8C%AF%E9%83%BD%E6%9C%89%E5%90%84%E8%87%AA%E7%9A%84%E7%89%B9%E6%80%A7%EF%BC%8C%E6%89%80%E4%BB%A5,%E6%8C%89%E5%88%B6%E9%80%A0%E5%8E%82%E5%95%86%E6%89%80%E6%8F%90%E4%BE%9B%E7%9A%84%E6%95%B0%E5%80%BC%E9%80%89%E6%8B%A9%E5%A4%96%E9%83%A8%E5%85%83%E5%99%A8%E4%BB%B6%E3%80%82%20%EF%BC%882%EF%BC%89%E5%9C%A8%E8%AE%B8%E5%8F%AF%E8%8C%83%E5%9B%B4%E5%86%85%EF%BC%8CC1%EF%BC%8CC2%20%E5%80%BC%E8%B6%8A%E4%BD%8E%E8%B6%8A%E5%A5%BD%E3%80%82

    晶振的起振原理:

            模拟器件搭建正弦波震荡电路_电路设计_乌云踏雪

            ESP8266物联网开发板设计3 ---晶振起振原理_物联网_乌云踏雪

    UART、RS232、RS485它们之间的区别:

            UART,是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),既然是“器”,显然,它就是个设备而已,要完成一个特定的功能的硬件,它本身并不是协议。那么它要完成什么功能呢?它的最基本功能,是串行数据和并行数据之间的转换。

            这就是UART做的最基本工作,进一步的,它还要控制“发车的班次”,比如确认一个Byte的这8个bit是什么时候开始的,又是什么时候结束的,两个班次之间至少要隔多长时间的缓冲,等等。这一部分,也具有协议的特征,但是相对于道路上的协议,更具有一般性,或曰,是与车在什么道路上开,相对独立的。

            RS232/RS485,是两种不同的电气协议,也就是说,是对电气特性以及物理特性的规定,作用于数据的传输通路上,它并不内含对数据的处理方式。比如,最显著的特征是:RS232使用3-15v有效电平,而UART,因为对电气特性并没有规定,所以直接使用CPU使用的电平,就是所谓的TTL电平(可能在0~3.3V之间)。更具体的,电气的特性也决定了线路的连接方式,比如RS232,规定用电平表示数据,因此线路就是单线路的,用两根线才能达到全双工的目的;而RS485, 使用差分电平表示数据,因此,必须用两根线才能达到传输数据的基本要求,要实现全双工,必需用4根线。但是,无论使用RS232还是RS485,它们与UART是相对独立的,但是由于电气特性的差别,必须要有专用的器件和UART接驳,才能完成数据在线路和UART之间的正常流动。

            UART、RS232、RS485它们实际上都是串口上面的属性,只不过它们的功能不一样。UART的功能是将串行转并行,而RS232、RS485是一种电平标准

    UART和RS232/RS485的关系是什么?_hututu_404的博客-CSDN博客_uart和485的区别 串口通讯是电子工程师和嵌入式开发工程师面对的最基本问题,RS232则是其中最简单最常用的通讯方式。但是初学者往往搞不清有关的名词如UART和RS232或RS485之间是什么关系,因为它们经常被放到语句中同等的位置使用。在百度搜索二者的区别,可以看到排在最前面的答案充斥着混淆的概念。就此,谈谈我对这几个概念的理解,希望能帮初学者厘清它们之间的关系。~~       通讯问题,和交通是一样的...https://blog.csdn.net/u013178472/article/details/81226780

    TTL电平信号:

    TTL电平标准:

    输出 L: <0.8V ;

    输出 H:>2.4V。

    输入 L: <1.2V ;

    输入H: >2.0V。

            TTL电平信号之所以被广泛使用,原因是:通常我们采用二进制来表示数据。而且规定,+5V等价于逻辑“1”,0V等价于逻辑“0”。这样的数据通信及电平规定方式,被称做TTL(晶体管-晶体管逻辑电平)信号系统。

            TTL电平长距离传输不了,抗干扰不行,衰减也大。长距离传输过程只能用RS232电平或者485电平,后者更远,在发送部分将TTL转换后,传输,接收部分再将传输电平转换为TTL电平。TTL作为逻辑电平很好,但是长距离传输确实能力有限。

    RS232串口
        RS232是计算机与通信工业应用中最广泛一种串行接口。它以全双工方式工作,需要地线、发送线和接收线三条线。RS232只能实现点对点的通信方式。
       RS232串口缺点
        ●接口信号电平值较高,接口电路芯片容易损坏。
        ●传输速率低,最高波特率19200bps。
        ●抗干扰能力较差。
        ●传输距离有限,一般在15m以内。
        ●只能实现点对点的通讯方式。
       RS232串口接口定义
        RXD:接收数据,TXD:发送数据,GND/SG:信号地。

    逻辑1(MARK)=-3V~-15V

    逻辑0(SPACE)=+3~+15V

     RS485串口
          RS485串口特点
        ●RS485采用平衡发送和差分接收,具有良好的抗干扰能力,信号能传输上千米。
        ●RS485有两线制和四线制两种接线。采用四线制时,只能实现点对多的通讯(即只能有一个主设备,其余为从设备)。四线制现在很少采用,现在多采用两线制接线方式。
        ●两线制RS485只能以半双式方式工作,收发不能同时进行。
        ●RS485在同一总线上最多可以接32个结点,可实现真正的多点通讯,但一般采用的是主从通信方式,即一个主机带多个从机。
        ●因RS485接口具有良好的抗干扰能力,长的传输距离和多站能力等优点使其成为首选的串行接口。    

            通常情况下,发送驱动器A、B之间的正电平在+2~+6V,负电平在-2~6V,另有一个信号地C。

    USB电平:

    电源线是5V,为USB设备提供最大500mA的电流,它与数据线上的电平无关,数据线是差分信号,通常D+和D-在+400mV~-400mV间变化,在传统的单端(Single-ended)通信中,一条线路来传输一个比特位。高电平表示1,低电平表示0。倘若在数据传输过程中受到干扰,高低电平信号完全可能因此产生突破临界值的大幅度扰动,一旦高电平或低电平信号超出临界值,信号就会出错。在差分传输电路中,输出电平为正电压时表示逻辑“1”,输出负电压时表示逻辑“0”,而输出“0”电压是没有意义的,它既不代表“1”,也不代表“0”。

    CMOS电平

            COMS集成电路是互补对称金属氧化物半导体(Compiementary symmetry metal oxide semicoductor)集成电路的英文缩写,电路的许多基本逻辑单元都是用增强型PMOS晶体管和增强型NMOS管按照互补对称形式连接的,静态功耗很小。

            COMS电路的供电电压VDD范围比较广在+5~+15V均能正常工作,电压波动允许±10,当输出电压高于VDD-0.5V时为逻辑1,输出电压低于VSS+0.5V(VSS为数字地)为逻辑0。CMOS电路输出高电平约为0.9Vcc,而输出低电平约为0.1Vcc当输入电压高于VDD-1.5V时为逻辑1,输入电压低于VSS+1.5V(VSS为数字地)为逻辑0。CMOS电路中不适用的输入端不能悬空,否则逻辑混乱。

    USB转串口电路:

     这是一个USB接口电路,连接电脑。

          

              CH340是一个usb转串口的芯片(USB电路为5V,所以CH340芯片也是5V供电)。当然,串口的电平标准有很多,这里我们可以看到,我们是将USB转换为TTL电平,通过UART来与CPU进行通信。

            CH340的接收端RXD与CPU的发送端UART1 TX  相连接,即CPU通过TX发送消息给CH340的RXD接收,然后CH340又通过UD+将信息发送给USB接口。

           同理,CH340的接收端TXD与CPU的发送端UART1 RX  相连接。CH340通过UD-接收来自USB接口发送的信息,而CPU则通过RX来接收由CH340的TXD发送的信息。

            注意:CH340也需要用外部晶振电路来驱动。因为它需要在时钟的基础上面来发送/接收数据。

     

    那为什么红框处要加一个二极管D4?

            我们可以看到,CH340芯片是5V供电,而cpu是3.3V供电。当cpu的UART1 RX接收来自CH340的TXD发送的数据的时候,此时D4二极管截止,D4二极管的阳极就为上拉电阻提供的3.3V,而不是CH340芯片的5V。那么此时,cpu识别到的电平就是TTL电平3.3V,而不是5V电平。

            

    注意:有的芯片供电是3.3V,它是不需要加这个二极管和上拉电阻的。

    展开全文
  • 为了赚取积分,仅供参考,需要自取
  • 外围电路比较全面的STM32F103ZE原理图,涵盖多种外围电路:SRAM、电机驱动、网卡、SD卡、DAC、MP3等等电路
  • STM32f103各种外围电路合集,一次下载搞定! STM32f103各种外围电路合集,一次下载搞定! STM32f103各种外围电路合集,一次下载搞定! STM32f103各种外围电路合集,一次下载搞定!
  • 单片机STM32F429最小系统电路图+以太网芯片LAN8720A+RJ45接口电路设计,包含Altium电路图和对应的PDF,以及对应的STM32F4的Lib库,已经过项目验证,硬件设计稳定可靠,可供初学者和设计师参考。
  • STM32学习】 - STM32单片机核心电路

    目录

    一:STM32介绍

    二:STM32主要优点

    三:STM32--最佳的平台选项

    四:STM32F103C8T6单片机核心板接口电路图如下图所示

    4.1 STM32单片机核心板接口原理图:

    4.2 STM32单片机实物图如下图:


    一:STM32介绍

    STM32系列处理器是意法半导体ST公司生产的一种基于ARM 7架构的32位、支持实时仿真和跟踪的微控制器。选择此款控制芯片是因为本系统设计并非追求成本的最低或更小的功耗,而是在实现本设计功能的前提下能够提供更丰富的接口和功能以便于设计实验系统各实验项目所需的外围扩展电路。此款控制芯片在完成单片机课程的学习后上手较为容易,在医疗器械中应用广泛,具有很好的学习、实验研究价值。

    二:STM32主要优点

    (1)使用ARM最新的、先进架构的Cortex-M3内核

    (2) 优异的实时性能

    (3) 杰出的功耗控制

    (4) 出众及创新的外设

    (5) 最大程度的集成整合

    (6) 易于开发,可使产品快速将进入市场

    三:STM32--最佳的平台选项

    对于使用同一平台进行多个项目开发而言,STM32是最佳的选择:

    (1) 从仅需少量的存储空间和管脚应用到需要更多的存储空间和管脚的应用

    (2) 从苛求性能的应用到电池供电的应用

    (3) 从简单而成本敏感的应用到高端应用

    (4) 全系列脚对脚、外设及软件的高度兼容性,给您带来全方位的灵活性。您可以在不必修改您原始框架及软件的条件下,将您的应用升级到需要更多存储空间或精简到使用更少存储空间/ 或改用不同的封装的规格。

    四:STM32F103C8T6单片机核心板接口电路图如下图所示

    4.1 STM32单片机核心板接口原理图:

    4.2 STM32单片机实物图如下图:

    展开全文
  • 基于STM32外围系统设计 文章目录基于STM32外围系统设计实现需求前言总体框架CUBEMX初始化关键代码LED流水灯广告屏滚动字幕启用PWM按键外部中断函数主函数总结 实现需求 前言 期末太忙,有空再写 总体框架 ...


    实现需求

    在这里插入图片描述
    在这里插入图片描述

    前言

    期末太忙,有空再写

    总体框架

    CUBEMX初始化

    配置DMA
    在这里插入图片描述
    配置按键和LED
    在这里插入图片描述
    配置DAC
    在这里插入图片描述
    TIM6负责DAC
    在这里插入图片描述
    TIM10负责PWM
    在这里插入图片描述
    时钟树配置
    在这里插入图片描述

    关键代码

    LED流水灯

    可由按键调整启用LED数量,上下限1-10个

    void FlowLED(int n){
    	for(int i=0;i!=n;i++){
    		switch(i){
    			case 0:
    				HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    			case 1:
    				HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    			case 2:
    				HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    			case 3:
    				HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    			case 4:
    				HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    			case 5:
    				HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED5_GPIO_Port,LED5_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    			case 6:
    				HAL_GPIO_WritePin(LED5_GPIO_Port,LED5_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED6_GPIO_Port,LED6_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    			case 7:
    				HAL_GPIO_WritePin(LED6_GPIO_Port,LED6_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED7_GPIO_Port,LED7_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    			case 8:
    				HAL_GPIO_WritePin(LED7_GPIO_Port,LED7_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED8_GPIO_Port,LED8_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    			case 9:
    				HAL_GPIO_WritePin(LED8_GPIO_Port,LED8_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED9_GPIO_Port,LED9_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    		}
    		if(flow_flag)ShowStr(mov);
    	}
    	for(int i=n-1;i>-1;i--){
    		switch(i){
    			case 0:
    				HAL_GPIO_WritePin(LED8_GPIO_Port,LED8_Pin,GPIO_PIN_RESET);
    				HAL_Delay(100);
    				break;
    			case 1:
    				HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    			case 2:
    				HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    			case 3:
    				HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    			case 4:
    				HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    			case 5:
    				HAL_GPIO_WritePin(LED5_GPIO_Port,LED5_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    			case 6:
    				HAL_GPIO_WritePin(LED6_GPIO_Port,LED6_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED5_GPIO_Port,LED5_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    			case 7:
    				HAL_GPIO_WritePin(LED7_GPIO_Port,LED7_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED6_GPIO_Port,LED6_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    			case 8:
    				HAL_GPIO_WritePin(LED8_GPIO_Port,LED8_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED7_GPIO_Port,LED7_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    			case 9:
    				HAL_GPIO_WritePin(LED9_GPIO_Port,LED9_Pin,GPIO_PIN_RESET);
    				HAL_GPIO_WritePin(LED8_GPIO_Port,LED8_Pin,GPIO_PIN_SET);
    				HAL_Delay(100);
    				break;
    		}
    		if(flow_flag)ShowStr(mov);
    	}
    }
    

    广告屏滚动字幕

    void ShowStr(int t){
    		LCD_Clear(WHITE);
      	LCD_ShowString(t,40,500,24,24,"STUDENT NUMBER : 19081516");	    //长度25*24=600
    		LCD_ShowString(t+50,70,500,24,24,"NAME : Li Tianyu");    //长度16*24=400
    		LCD_ShowString(t+53,100,200,24,24,"GROUP : Unknown");    //长度15*24=376
    		if(mov>=480)mov=0;
    		else mov+=15;
    }
    

    启用PWM

    HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);
    

    按键外部中断函数

    此函数放于gpio.c下

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
    	extern int n;
      int pulse;
    	extern int flow_flag;
    	extern int wave_flag;
    	extern int freq;
    
    	switch(GPIO_Pin){
    		case KEY0_Pin:                      //判断KEY0
    			delay_ms(10);	//消抖
    			if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==0 && HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin)==0){
    				if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==1){   //减少灯
    					if(n>1)n--;
    					flow_flag=1;
    					//LCD_Clear(WHITE);
    					//sprintf((char*)led,"LED NUMBER: %02d",n);
    					//LCD_ShowString(100,40,500,24,24,led);
    				}
    			}
    			
    			else if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==1){
    				if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==1){
    					flow_flag=0;
    					STMFLASH_Read(FLASH_SAVE_ADDR,(u32 *)comp,SIZE);
    					sscanf((char*)comp,"%d",&pulse);
    					if(pulse>40) pulse-=42;
    					__HAL_TIM_SET_COMPARE(&htim10,TIM_CHANNEL_1,pulse);  //降低占空比
    					sprintf((char*)comp,"%d",pulse);
    					STMFLASH_Write(FLASH_SAVE_ADDR,(u32 *)comp,SIZE);
    					sprintf((char*)comp,"PWM:%d %%",pulse*100/840);
    					LCD_Clear(WHITE);//清除半屏 
    					LCD_ShowString(100,40,500,24,24,(u8 *)comp);
    					delay_ms(100);
    				}
    			}
    			else if(HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin)==1) {
    				if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==1){     //提高频率 步长100
    					if(freq<10000)freq+=100;
    					int reload=84000000/256/freq-1;
    					__HAL_TIM_SET_AUTORELOAD(&htim6,reload);
    					sprintf((char *)fre,"Frequence: %d",84000000/256/(reload+1));
    					LCD_Clear(WHITE);
    					LCD_ShowString(100,40,500,24,24,(u8 *)fre);
    				}
    			}
    			break;
    			
    		case KEY1_Pin:                      //判断KEY1
    			delay_ms(10);	//消抖
    			if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==0 && HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin)==0){
    				if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==1){  //增加灯
    					if(n<10)n++;
    					flow_flag=1;
    					//LCD_Clear(WHITE);
    					//sprintf((char*)led,"LED NUMBER: %02d",n);
    					//LCD_ShowString(100,40,500,24,24,led);
    				}
    			}
    			
    			else if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==1){
    				if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==1){
    					flow_flag=0;
    					STMFLASH_Read(FLASH_SAVE_ADDR,(u32 *)comp,SIZE);
    					sscanf((char*)comp,"%d",&pulse);
    					if(pulse<800) pulse+=42;
    					__HAL_TIM_SET_COMPARE(&htim10,TIM_CHANNEL_1,pulse);  //降低占空比
    					sprintf((char*)comp,"%d",pulse);
    					STMFLASH_Write(FLASH_SAVE_ADDR,(u32 *)comp,SIZE);						
    					sprintf((char*)comp,"PWM:%d %%",pulse*100/840);
    					LCD_Clear(WHITE);//清屏 
    					LCD_ShowString(100,40,500,24,24,(u8 *)comp);
    					delay_ms(100);
    				}
    			}
    			
    			else if(HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin)==1) {
    				if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==1){     //降低频率 步长100
    					if(freq>800)freq-=100;
    					int reload=84000000/256/freq-1;
    					__HAL_TIM_SET_AUTORELOAD(&htim6,reload);
    					sprintf((char *)fre,"Frequence: %d",84000000/256/(reload+1));
    					LCD_Clear(WHITE);
    					LCD_ShowString(100,40,500,24,24,(u8 *)fre);
    				}
    			}
    			break;
    			
    			case KEY2_Pin:
    				delay_ms(10);
    				LCD_Clear(WHITE);
    				LCD_ShowString(100,40,500,24,24,(char *)"Setting PWM!");   //KEY2对应pwm占空比设置
    				break;
    			
    			case KEY3_Pin:
    				delay_ms(10);
    				flow_flag=0;
    				LCD_Clear(WHITE);
    				wave_flag=(wave_flag+1)%4;
    				switch(wave_flag){
    					case 0: //0对应方波
    						HAL_DAC_Stop_DMA(&hdac,DAC_CHANNEL_1);
    						HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1, (uint32_t*)square_8bit, 256, DAC_ALIGN_8B_R);
    						LCD_ShowString(100,40,500,24,24,(char *)"Square Wave Generating!");
    						break;
    					case 1: //1对应三角波
    						HAL_DAC_Stop_DMA(&hdac,DAC_CHANNEL_1);
    						HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1, (uint32_t*)triangle_8bit, 256, DAC_ALIGN_8B_R);
    						LCD_ShowString(100,40,500,24,24,(char *)"Triangle Wave Generating!");
    						break;
    					case 2: //2对应正弦波
    						HAL_DAC_Stop_DMA(&hdac,DAC_CHANNEL_1);
    						HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1, (uint32_t*)sine_8bit, 256, DAC_ALIGN_8B_R);
    						LCD_ShowString(100,40,500,24,24,(char *)"Sine Wave Generating!");
    						break;
    					case 3: //3对应锯齿波
    						HAL_DAC_Stop_DMA(&hdac,DAC_CHANNEL_1);
    						HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1, (uint32_t*)sawtooth_8bit, 256, DAC_ALIGN_8B_R);
    						LCD_ShowString(100,40,500,24,24,(char *)"Sawtooth Wave Generating!");
    						break;	
    				}
    	}
    
    }
    

    主函数

    int main(void)
    {
      /* USER CODE BEGIN 1 */
    	char comp[20];
    	int pulse=420-1;
    	u16 adcx;
    	extern uint32_t frequency_measure;
    	extern uint32_t cnt_TIM5;
    	extern uint8_t	TIM5CH2_CAPTURE_STA;
    	float temp;
      /* USER CODE END 1 */
    
      /* MCU Configuration--------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_DMA_Init();
      MX_TIM10_Init();
      MX_DAC_Init();
      MX_TIM6_Init();
      MX_TIM2_Init();
      MX_TIM1_Init();
      /* USER CODE BEGIN 2 */
    	delay_init(168); 
    	uart_init(115200);             	//初始化USART
    	LCD_Init();           			//初始化LCD FSMC接口
    	HAL_TIM_Base_Start(&htim1);     //定时中断记录周期数
    //	HAL_TIM_Base_Start(&htim5);     //输入触发cnt+1
    	HAL_TIM_Base_Start(&htim6);
    	HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1, (uint32_t*)square_8bit, 256, DAC_ALIGN_8B_R);
    
    	
    	
    	//HAL_DMA_Start_IT(hdac.DMA_Handle1,(uint32_t)sine_8bit[256],0U,256);
    	LCD_Clear(WHITE);
    	POINT_COLOR=RED;     			//画笔颜色:红色
    	
    	//sprintf((char*)comp,"%d",420);
    	//STMFLASH_Write(FLASH_SAVE_ADDR,(u32 *)comp,SIZE);
    	HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);
    	LCD_ShowString(100,40,500,24,24,"STUDENT NUMBER : 19081516");	
    	LCD_ShowString(150,70,500,24,24,"NAME : Li Tianyu");
    	LCD_ShowString(153,100,200,24,24,"GROUP : Unknown");
    	
    	STMFLASH_Read(FLASH_SAVE_ADDR,(u32 *)comp,SIZE);    //读取flash
    	sscanf((char*)comp,"%d",&pulse);
    	__HAL_TIM_SET_COMPARE(&htim10,TIM_CHANNEL_1,pulse);  //设置占空比
    	
    	HAL_Delay(500);   //亮灯
    	ShutLED();
    	
    
    	
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
    		
    		FlowLED(n);
    		mov+=5;
    
      }
      /* USER CODE END 3 */
    }
    

    有些变量定义可能没截出,需要的话可以看着自己补一下定义,我会在忙完了以后补上。

    总结

    这是给大二本学期电设实验课做的综合设计,各个部分都比较好做,整合一下就可以成为初步的外围系统。工程文件已上传,可以在资源下载。
    还有两个拓展需求,高频频率计和低频示波器,会慢慢补完,后续在新的文章更新。

    展开全文
  • STM32外部引脚电路个人总结

    千次阅读 多人点赞 2021-07-29 19:55:06
    会有几组VDD和VSS 一组VDDA和VSSA ...那么再看下面电路原理图,这几个引脚所接的你就都能看懂了。叫你自己独立画也会画了。 https://www.bilibili.com/video/BV1Pk4y1z7Ai/?spm_id_from=333.788.recommend_m..
  • STM32F446R 的开发板采用 ARM Cortex-M4F CPU,工作时脉 180MHz,板子上有SD卡、LED、按键、FFCSPI ... 等资源,并将没使用到的 I/O 全部拉出到排针接口,方便实验。 硬件资源: 控制器 : STM32F446R 64Pin 180MHz ...
  • 包括原理图和PCB原文件,以及电路上用到的所有器件原理图库和PCB封装库,电路为官方原板,外围电路丰富,包括CAN、电机控制、SD卡、音频处理、I/O扩展、USB接口、串口接口、存储扩展、LCD接口和STM32F107核心系统...
  • 21632.zip,FrVIDs32MHq5yjZilpmHUBOrbguv.png,Fk2DZiO8ibBEI-DdaaSbS8yCktUU.png,FrFl5ITrqdaP1a8LCzWONDxtO1YF.png,FqFmOJP_CBm25YDaqs8NuDrTUCji.png,Schematic_Development Board STM32F103RET6_2020-11-15_21-19...
  • 该设计是基于STM32F030C8微控制器的最小系统。 STM32F030C8是基于ST推出的Contex-M0内核的单片机,最大频率为48MHz。它具有64KB的Flash和8KB的SRAM。在经济性和性能之间达到很好的平衡。 核心板的超小尺寸使其可以...
  • 给大家分享Altium Designer画的STM32F072C8T6最小系统原理图和PCB图资料,需要的可以下载,免费分享! 原理图以及PCB图截图如下: 附件内容截图:
  • 基于STM32F407通过I2C驱动片外RTC时钟电路-嵌入式源码
  • STM32 VBAT外围电路接法详解

    万次阅读 多人点赞 2018-05-15 21:11:13
    给大家看几块开发板的VBAT外围电路的设计图:(1)(2)(3)(4)(5)stm32芯片手册要求:(大体上就这两个要求,具体要求看AN2586供电方案)(1)如果应用中没有使用外部电池,VBAT必须连接到VDD引脚上。...
  • STM32F405RGT6主控板电路设计(包含原理图、PCB、封装库文件)
  • STM32最小系统硬件组成详解 0组成: 电源 复位 时钟 调试接口 ...有源:更稳定 成本更高 需要接电源供电 不需要外围电路 3脚单线输出 无源:精度基本够 方便灵活 便宜 最大区别:是否需要单独供电 无源晶振需要外接起振电容
  • stm32f401完整版电路原理图,包括主原理图,各部分细节原理图,包括USB等模块细节原理,适合新手学习,细化LED接口位置
  • STM32f103实现CAN通讯。
  • 最小的基于STM32F205VE的系统板,与STM32F103Vx和STM32F407Vx兼容。 板载ST-Link V2.1,它集成了调试,串行端口,USB下载和集成。 新功能: 优化的电路设计,现在所有GPIO都映射到多达1个外设,没有IO冲突 优化电路...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,476
精华内容 1,390
关键字:

stm32外围电路