STM32单片机电源端并联电容的重要性

2023-05-16

如图,笔者用TQFP(32-100PIN)0.55MM转直插的转接板焊了一个STM32F207VET6的板子。板上引出了SWD调试接口(仅占用PA13和PA14),USART1串口引脚,插了一个触摸传感器和蜂鸣器模块。

所要实现的功能是:用手触碰一下触摸传感器后,蜂鸣器响一声。

接触摸传感器模块输出信号接到PA0口上。在没有接电源电容之前,每一次单片机复位(无论是软件复位还是按下复位键复位),PA0上会自动产生一个异常的高电平,要等上将近10秒才会回到低电平,然后触摸传感器才能正常工作。每次复位的时候蜂鸣器都会响一下,10秒之内按触摸键都没有反应。

后来我接了一个4.7μF的电解电容器和两个100nF的无极性电容器,问题就解决了。单片机复位后蜂鸣器不会响,手按触摸键后马上就能响,不用再等10秒。

还有,不接电容器,串口下载以及SWD/JTAG下载有时也会受影响。特别是没有外接25MHz的HSE晶振的情况下,Flash Loader Demo(串口烧写STM32的工具)经常连不上芯片。

这说明,这些电容对保证单片机以及外围器件运行的可靠性非常重要。


【20-Pin的SWD调试接口连线】


【测试用的程序】

#include <stdio.h>
#include <stm32f2xx.h>

int fputc(int ch, FILE *fp)
{
  if (fp == stdout)
  {
    if (ch == '\n')
    {
      while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
      USART_SendData(USART1, '\r');
    }
    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    USART_SendData(USART1, ch);
  }
  return ch;
}

void showclk(void)
{
  RCC_ClocksTypeDef clocks;
  RCC_GetClocksFreq(&clocks);
  printf("USART1->BRR=%d\n", USART1->BRR);
  printf("SYSCLK=%dHz HCLK=%dHz PCLK1=%dHz PCLK2=%dHz\n", clocks.SYSCLK_Frequency, clocks.HCLK_Frequency, clocks.PCLK1_Frequency, clocks.PCLK2_Frequency);
  printf("HSERDY=%d, SYSCLK=%d\n", RCC_GetFlagStatus(RCC_FLAG_HSERDY), RCC_GetSYSCLKSource());
}

int main(void)
{
  EXTI_InitTypeDef exti;
  GPIO_InitTypeDef gpio;
  TIM_OCInitTypeDef oc;
  TIM_TimeBaseInitTypeDef tim;
  USART_InitTypeDef usart;
  
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_TIM2, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  PWR_BackupAccessCmd(ENABLE);
  
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_TIM2);
  gpio.GPIO_Mode = GPIO_Mode_AF;
  gpio.GPIO_OType = GPIO_OType_PP;
  gpio.GPIO_Pin = GPIO_Pin_3;
  gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
  gpio.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_Init(GPIOA, &gpio);
  
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
  gpio.GPIO_Pin = GPIO_Pin_9;
  gpio.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &gpio);
  
  USART_StructInit(&usart);
  usart.USART_BaudRate = 115200;
  USART_Init(USART1, &usart);
  USART_Cmd(USART1, ENABLE);
  
  showclk();
  
  if (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == SET)
    printf("LSE on!\n");
  else
  {
    RCC_ITConfig(RCC_IT_LSERDY, ENABLE);
    NVIC_EnableIRQ(RCC_IRQn);
    RCC_LSEConfig(RCC_LSE_ON);
  }
  
  TIM_UpdateRequestConfig(TIM2, TIM_UpdateSource_Regular);
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
  NVIC_EnableIRQ(TIM2_IRQn);
  
  TIM_TimeBaseStructInit(&tim);
  tim.TIM_Period = 9;
  tim.TIM_Prescaler = 1699;
  TIM_TimeBaseInit(TIM2, &tim);
  
  oc.TIM_OCMode = TIM_OCMode_PWM2;
  oc.TIM_OCPolarity = TIM_OCPolarity_High;
  oc.TIM_OutputState = TIM_OutputState_Enable;
  oc.TIM_Pulse = 4;
  TIM_OC4Init(TIM2, &oc);
  
  exti.EXTI_Line = EXTI_Line0;
  exti.EXTI_LineCmd = ENABLE;
  exti.EXTI_Mode = EXTI_Mode_Interrupt;
  exti.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
  EXTI_Init(&exti);
  NVIC_EnableIRQ(EXTI0_IRQn);
  
  while (1)
    __WFI();
}

void EXTI0_IRQHandler(void)
{
  EXTI_ClearITPendingBit(EXTI_Line0);
  if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET)
  {
    TIM_Cmd(TIM2, ENABLE);
    printf("Touch!\n");
  }
  else
    printf("Released!\n");
}

void RCC_IRQHandler(void)
{
  if (RCC_GetITStatus(RCC_IT_LSERDY) == SET)
  {
    RCC_ClearITPendingBit(RCC_IT_LSERDY);
    printf("LSE ready!\n");
  }
}

void TIM2_IRQHandler(void)
{
  static uint16_t counter = 0;
  if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    counter++;
    if (counter == 999)
      TIM_SelectOnePulseMode(TIM2, TIM_OPMode_Single);
    else if (counter == 1000)
    {
      counter = 0;
      TIM_SelectOnePulseMode(TIM2, TIM_OPMode_Repetitive);
    }
  }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32单片机电源端并联电容的重要性 的相关文章

随机推荐

  • Linux-2.6.32.67内核裁剪与移植之LCD驱动的移植(2)

    Linux 2 6 32 67内核裁剪与移植之LCD驱动的移植 作者 xff1a 赵凯 QQ xff1a 1205958201 注 xff1a 转载请注明出处哦 内核源码中的 drivers video s3c2410fb c 就是LCD的
  • arecord用法及其含义

    1 命令格式 arecord flags filename 2 选项含义 h xff0c help 帮助 xff09 V xff0c version 打印版本信息 xff09 l xff0c list devices 列出全部声卡和数字音频
  • arduino Windows7 64位下驱动安装失败解决办法

    Arduino在64位Windows7操作系统下驱动安装失败 操作系统环境 xff1a 64位 win7 旗舰版 失败现象 xff1a INF段落无效 驱动不适用该平台等 解决办法 xff1a 1 找到C Windows inf setup
  • WinRAR分析

    1 xff0e 样本概况 1 1 应用程序信息 应用程序名称 xff1a WinRAR 6 11 0 MD5值 xff1a F2BD2E3D8B7C7C8EEFA2B28E3280EDA3 SHA1值 xff1a DC2B378B27D1A
  • 树莓派搭建代理服务器(基于Squid)

    第一步 xff1a https blog csdn net bql email article details 79147250 第二个 xff1a 要使用Proxifier等软件 sudo gedit etc squid squid co
  • Nginx 使用naxsi 防xss、防注入攻击配置

    61 61 对于nginx有相应模块来完成WAF构建 xff0c 此处使用的是naxsi模块 61 61 Naxsi是一个开放源代码 高效 低维护规则的Nginx web应用防火墙模块 Naxsi的主要目标是帮助人们加固他们的web应用程序
  • pytorch 把tensor转换成int

    直接在tensor变量的后面加 item xff0c 就能把tensor类型转换成int类型 xff0c 我也不知道为什么 xff0c 试了别的都不行 准确的说是把Tensor 转化成Python scales
  • 最新软件设计师知识点分析(思维导图)

    大家好 xff0c 作为一个考取软件设计师的过来人 xff0c 今天我给大家分享一下关于软件设计师考题的复习经验 1 多做多分析多总结近年来习题 xff08 达到看到题就知道考点是什么怎么解 xff09 2 知道怎么在题中怎么找答案 3 梳
  • 记一次阿里云服务器被攻击导致无法ssh登陆(root也不行)

    服务器被攻击导致无法ssh 博主早上登陆准备做一些骚操作 xff0c 结果突然发现ssh不上服务器 xff0c 并且收到短信说服务器被挖矿病毒攻击 xff0c 然后服务器就斯密达了 xff0c 发现报错如下 xff1a Permission
  • Python geometry_msgs.msg.PoseStamped() Examples

    https www programcreek com python example 70252 geometry msgs msg PoseStamped
  • github 下载历史版本的代码

    操作如下所示 xff1a 根据历史commit xff0c 找到历史版本 xff0c 然后下载
  • 欢迎使用CSDN-markdown编辑器

    转 Eclipse下tomcat输出路径配置 标签 xff1a tomcateclipseserverpath 2012 07 12 16 09 7256人阅读 评论 0 收藏 举报 分类 xff1a eclipse tomcat xff0
  • 那根你想顺着去打人的网线是怎么制作的?

    更多精彩关注微信公众号 xff1a 信息技术员 现代社会大家都很浮躁 xff0c 总有人嚷嚷着要顺着网线去打人 xff0c 也不问问自己会做网线么 xff1f 本文手把手教你怎么制作一根网线 一 准备工作 1 网线一根 2 网线钳一把 3
  • Linux下动态库使用小结

    1 xff0e 静态库和动态库的基本概念 静态库 xff0c 是在可执行程序连接时就已经加入到执行码中 xff0c 在物理上成为执行程序的一部分 xff1b 使用静态库编译的程序运行时无需该库文件支持 xff0c 哪里都可以用 xff0c
  • 傻瓜式教学——手把手教你电脑三种方式连接打印机

    如何判断打印机和电脑的连接方式 xff1f 电脑连接打印机有三种方式情况 xff0c 一是通过USB直连 xff0c 二是通过网络连接 xff0c 三是通过共享连接 可通过下面方法判断连接方式 如果通过 口和电脑连接 xff0c 则是USB
  • 服务器为什么能够稳定可靠运行?

    前几天github服务器故障 xff0c 传言服务器被偷走一度上了热搜 xff0c 后证实传言是P图 xff08 下图为假 xff09 但确实每次大型互联网公司服务器故障都引发了人们的广泛讨论 其中还有不少上了热搜 那么服务器到底是何方神圣
  • Yanmar(洋马)发动机SPN-FMI代码在仪表显示

    分享一个自己在仪表上显示洋马发动机SPN FMI代码过程的记录 1 问 xff1a SPN和FMI什么意思 xff1f 答 xff1a 见SAE J1939 73 5 6 诊断故障码定义 诊断故障代码 xff08 DTC xff09 由4
  • APM调试,地面站随手记

    最近随公司调试4轴和8轴APM多旋翼 xff0c 本文将心得记录下来 xff0c 以备自己和他人查阅 xff0c 水平有限 xff0c 如有错误 xff0c 请不吝赐教 本文不定期更新 xff0c 转载请注明出处 2016 9 8 一 自检
  • 解决同一局域网下不同网段能ping通但是ssh不上服务器的情况

    一 xff1a 问题描述 xff1a 在公司的局域网网络环境下有四个ip网段 xff0c 分别是192 168 1 0 2 0 3 0 5 0 xff0c 服务器用的是5 0网段的 xff0c 而个人电脑用的则是1 0网段的 xff0c 在
  • STM32单片机电源端并联电容的重要性

    如图 xff0c 笔者用TQFP 32 100PIN 0 55MM转直插的转接板焊了一个STM32F207VET6的板子 板上引出了SWD调试接口 xff08 仅占用PA13和PA14 xff09 xff0c USART1串口引脚 xff0