stm32f103

stm32F103之ADC模数转换

偶尔善良 提交于 2020-03-12 13:58:26
一、ADC简介   通常是指一个将模拟信号转变为数字信号的电子元件。通常的模数转换器是把经过与标准量比较处理后的模拟量转换成以二进制数值表示的离散信号的转换器。      12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。 二、ADC功能框图 掌握了ADC 的功能框图,就可以对ADC 有一个整体的把握,在编程的时候可以做到了然如胸,不会一知半解。框图讲解采用从左到右的方式,跟ADC 采集数据,转换数据,传输数据的方向大概一致。 三、ADC功能描述 1、电压输入范围   ADC 输入范围为:VREF- ≤ VIN ≤ VREF+。由VREF-、VREF+ 、VDDA 、VSSA、这四个外部引脚决定。   设计原理图的时候一般把VSSA和VREF-接地,把VREF+和VDDA 接3V3,得到ADC的输入电压范围为:0~3.3V。 2、输入通道   我们确定好ADC 输入电压之后,那么电压怎么输入到ADC?这里我们引入通道的概念,STM32 的ADC 多达18 个通道,其中外部的16 个通道就是框图中的ADCx_IN0、ADCx_IN1...ADCx_IN5

STM32F103处理器内部存储器

◇◆丶佛笑我妖孽 提交于 2020-02-24 23:02:10
STM32F103处理器内部存储器结构及映射    STM32F103存储器映像为 预定义形式 ,严格规定了哪个位置使用哪条总线。    STM32F103的程序存储器、数据存储器、寄存器和IO端口被组织到一个4GB的线性地址空间。数据字节以小端模式存放在存储器中。地址空间分8块,每块512MB。 注: 小端模式 :与大端模式相对应,将数据的低字节保存在内存的低地址中,高字节保存在高地址中。 其中:      代码区 :(0x00000000 ~ 0x1FFFFFFF,512MB)      主要包括 : 启动空间 (0x00000000 ~ 0x07FFFFFF,128MB)                Flash (0x08000000 ~ 0x08xxxxxx,16KB~1MB)                系统存储区 (0x1FFFF000 ~ 0x1FFFF800,2KB)     Flash :用于存放用户编写的程序     系统存储区 :存放串口下载程序,当系统上电后,根据用户设定的启动配置,将Flash或系统存储区映射到启动空间,执行用户程序或串口下载程序。    内部 SRAM (0x20000000 ~ 0x200xxxxx,6~96KB):保护程序运行时产生的临时数据的随机存储器。     外设区 :外设寄存器地址空间,用于调试组件等私有外设。例如:FPB

大话STM32F103系统架构

吃可爱长大的小学妹 提交于 2020-02-02 20:39:54
前言   许多像我一样的STM32初学者,都往往忽视了STM32系统架构的学习。这对于实际应用并没有啥大的影响,但是总感觉怎么学也无法看清STM32的全貌,所以本文我将带领大家一起厘清STM32F103的总线结构和各部分外设之间的关系。在《三体》小说中,作者曾用军队阵列的方法模拟了冯诺依曼架构的计算机,读来画面感十足,且易于理解,本文也力求解释的形象与生动。 系统全貌   在罗列各个方阵前,我们有必要先登上高山,一览军队全貌,如官方手册里的框图所示,相比51单片机,STM32F103系统还是相当复杂的,但是其阵列也必将威武雄壮。 系统剖析 Cortex-M3内核   它是STM32F103的内核,也就是CPU,相当于元帅。除掉他,其他部件都是片上外设,注意是片上的,也就是那块我们肉眼所见的芯片里的外设。这位元帅足不出户,便可操纵队列,依靠的是自己强大的数字运算能力和强大的总线设计。在阵列中,数据的运算都呈报给元帅来做。 ICode总线   阵列的运行需要有人下达指令,元帅Cortex-M3是命令的下发者,却并非命令的产生者。那么命令从何而来?在《三体》中,冯诺依曼在布阵前早已想好了指令。同样,各位STM32的热爱者才是聪慧的命令发起者——我们写好的程序被译成机器指令存储于Flash中。ICode总线就是一队骑兵,将指令一条条送达给元帅Cortex-M3。 Bus-Matrix  

STM32F103中断系统

▼魔方 西西 提交于 2020-01-19 04:40:55
一、中断介绍 1.1 中断概念 CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程称为中断。引发中断的称为中断源。比如:看电视时突然门铃响,那么门铃响就相当于中断源。有些中断还能够被其他高优先级的中断所中断,那么这种情况又叫做中断的嵌套。 STM32F10x芯片有84个中断通道,包括 16 个内核中断和 68 个可屏蔽中断,这些中断通道已按照不同优先级顺序固定分配给相应的外部设备。 1.2 NVIC介绍 NVIC英文全称是Nested Vectored Interrupt Controller,中文意思就是嵌套向量中断控制器,它属于M3内核的一个外设,控制着芯片的 中断相关功能。由于ARM给NVIC预留了非常多的功能,但对于使用M3内核设计芯片的公司可能就不需要这么多功能,于是就需要在NVIC上裁剪。ST公司的STM32F103芯片内部中断数量就是NVIC裁剪后的结果。 中断控制相关寄存器在固件库core_cm3.h文件NVIC结构体内。可打开任意库函数工程即可查看到。 1.3 中断优先级 STM32F103芯片支持60个可屏蔽中断通道,每个中断通道都具备自己的中断优先级控制字节(8位

STM32F103 spi flash w25q128挂载文件系统fatfs

一笑奈何 提交于 2019-12-18 10:58:41
前言: 本系列博客我们围绕SDIO Wi-Fi模块Marvell8801来揭开SDIO Wi-Fi的神秘面纱,开发MCU选用STM32F103RET6,外设包括SPI FLASH(W25Q128),摄像头(OV7670 FIFO),OLED(SSD1306),USB device,如下图所示: 一共分两个测试例程:1.硬件测试例程 2.Wi-Fi测试例程,分别搭配上位机来测试,上位机测试视频链接如下: TODO:视频教程 我们的目的是引领对无线感兴趣的工程师或者学生快速入门,会通过以下几方面来切入: 分别是: 1)整体介绍篇,主要对开发板做整体介绍 2)硬件篇,主要对板子外设驱动做说明 3)Linux Wi-Fi篇,主要通过Linux来驱动Wi-Fi模组来了解Linux kernel的无线架构 4)自己实现Marvell8801驱动,主要是根据编程手册来自己实现一个SDIO Wi-Fi的驱动 5)LWIP篇,通过移植LWIP来实现驱动的应用 通过以上系列的文章,相信你对Wi-Fi就会有一个深刻的认知,起到举一反三的作用,以后不管是哪个平台(裸奔,RTOS,Linux,Android)说起驱动Wi-Fi你都不会慌张。 我们的优势: 1)代码全部自主研发,会提供更加专业的售后服务 2)上位机测试程序,让你测试起来程序会更加灵活 3)Marvell官方NDA资料(全网独家) 4

CanFestival移植到STM32F103

北战南征 提交于 2019-12-12 14:16:24
CanFestival移植到STM32F103 分类专栏: STM32 CANOpen 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/lushoumin/article/details/88546785 收起 1.创建工程 2.将CanFestival源码,拷贝到工程目录 3.删除其它架构和编译器的代码 查看include文件夹发现没有cortex-m3架构,因此我们这里借鉴AVR架构进行修改 将AVR文件夹重命名为STM32,并删除其它架构文件夹 打开STM32文件夹,将里面avr相关的文件删除,我们用的开发环境是MDK,因此将iar相关文件也删了 打开src文件夹,将其它架构、编译器和系统的文件给删了 4.将CanFestival文件添加进工程 添加好之后,编译出现错误,config文件中包含了很多iar相关头文件 将这些头文件删除 重新编译,依然存在错误,提示有很多函数没有定义 先解决start_and_seek_node和start_node的问题,打开def.c文件发现这两个函数定义了 其实,这是MDK开发环境的问题,不要太纠结这个问题,把inline删掉就好了 然后重新编译,还剩下三个错误canSend

STM32F103/302 SPI3 接口使用例程

匿名 (未验证) 提交于 2019-12-03 00:26:01
最近在用STM MCU 的SPI3,把一些使用时的注意点给大家记录一下,该注意的几点都注意了: 1,开GPIO时种 2,开SPI3时钟 3,GPIO引脚功能设定 4,如果有引脚复用的或与JTAG口有共用的引脚要对GPIO进行remap等 代码如下: void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // NSS GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // SPI GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 |GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF

单片机stm32F103单片机晶振不起振的原因分析

佐手、 提交于 2019-12-02 04:51:00
  这是我在做单片机最小系统板时候碰到的问题,之前虽然也做过相似的板子,可是未曾出现过无源晶振不起振的问题。下面是我在遇到问题后的一些检查,排除问题的过程。本人小菜鸟一个,文章中如有错误和不足,还望各位大佬指正和补充。   事情是这样的,本人做了一款32单片机最小系统板(先叫它老大),在老大出来之前的前五个月,我用相同的PCB板焊了一款用在毕设上面,那个是能正常工作的。板上有个小负载,LED灯。想让这个灯闪烁。代码是没有问题的,因为下载到从网上买的单片机是正常工作的。用JLink下载到自己做的板子上也是能下载进去的,但是不工作。怀疑晶振没起振。用示波器测量晶振引脚对地为一个高电平,而控制那个灯亮的管脚一直是高电平。买回来的板子晶振引脚对地为一个正弦波,控制灯的引脚波形为方波。   找到问题出现在板子时钟没起振,到底是时钟电路哪个地方出问题了还未得知。首先想到的是换个晶振,8M的晶振换了(第一次换),换过后,程序烧写进去,复位按键按下,灯不亮。接着考虑晶振旁边的匹配电容的问题,将匹配电容由22pf换成了20pf,仍然是不工作。没想通是为什么。于是将剩余的器件和板子拿出来想焊另外一块对着排查,结果焊接的时候,没控制好力道,把引脚弄弯了,芯片引脚勾肩搭背了,开始谈恋爱了,狂撒一波狗粮。这样肯定不行啊,月老不能乱点鸳鸯谱啊,于是,用热风枪把整个芯片吹下来了,棒打鸳鸯,结果焊盘不愿意了

关于STM32F103系列从大容量向中容量移植的若干问题

懵懂的女人 提交于 2019-12-01 13:27:00
一、把STM32F103大容量移植到STM32F103C8T6上的步骤: 1、换启动文件 startup_stm32f10x_cl.s ——互联型的器件 包括:STM32F105xx,STM32F107xx startup_stm32f10x_hd.s ——大容量器件 包括:STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_hd_vl.s ——大容量器件 包括:STM32F100xx startup_stm32f10x_ld.s ——小容量器件 包括:STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_ld_vl.s ——小容量器件 包括:STM32F100xx startup_stm32f10x_md.s ——中容量器件 包括:STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_md_vl.s ——中容量器件 - startup_stm32f10x_ld_vl.s: for STM32 Low density Value line devices - startup_stm32f10x_ld.s: for STM32 Low density devices - startup_stm32f10x_md_vl.s:

STM32F103学习笔记 (十) TFTLCD 显示

吃可爱长大的小学妹 提交于 2019-12-01 07:00:45
看了TFTLCD和FSMC( 灵活的静态存储控制器 )的简介,还是一知半解,不知所云。 TFTLCD使用80并口,80 并口有如下一些信号线: CS: TFTLCD 片选信号。 WR:向 TFTLCD 写入数据。 RD:从 TFTLCD 读取数据。 D[15: 0]: 16 位双向数据线。 RST:硬复位 TFTLCD。 RS:命令/数据标志( 0,读写命令; 1,读写数据)。 只是记住FSMC在使用的时候要初始化和使能就行了。 关于lcd.c这个文件竟然接近3000行,好吧,我是写不出来,只能在主函数里调用了。 main.c: int main(void) { u8 x=0; u8 lcd_id[12]; //存放LCD ID字符串 delay_init(); //延时函数初始化 NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(9600); //串口初始化为9600 LED_Init(); //LED端口初始化 LCD_Init(); POINT_COLOR=RED; sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到lcd_id数组。 while(1) { switch(x) { case 0:LCD_Clear(WHITE)