精华内容
下载资源
问答
  • NS32F103C8T6 可完美替代 STM32F103C8T6
    千次阅读
    2022-02-10 14:35:15

    NS32F103X8和NS32F103XB标准型MCU系列使用高性能的ARM Cortex-M3 32 位的RISC内核,工作频率为72MHz,内置高速存储器(高达128K字节的闪存和20K字节的SRAM),丰富的增强I/O端口和联接到两条APB总线的外设。其中包含2个12位ASDC、3个通用16位定时器和1个PWM定时器,此外,还包含标准和先进的通信接口:多达2个I2C接口和SPI接口、3个USART接口、1个USB接口和1个CAN接口。

    NS32F103X8和NS32F103XB标准型MCU系列产品供电电压为2.0V至3.6V,-40℃至+85℃的工作温度范围以及-40℃至+105℃的扩展温度范围,一系列的省电模式保证低功耗应用的要求。
    NS32F103X8和NS32F103XB标准型系列产品提供包括从36脚至100脚的4种不同封装形式:根据不同的封装形式,器件中的外设配置不尽相同。下面给出了该系列产品中所有外设的基本介绍。
    这些丰富的外设配置,使得NS32F103X8和NS32F103XB标准型系列微控制器可使用于多种应用场合:
    l 电机驱动和应用控制
    l 医疗和手持设备
    l PC游戏外设和GPS平台
    l 工业应用:可编程控制器(PLC)、变频器、打印机和扫描仪
    l 警报系统、视频对讲和暖气通风空调系统等

     

    更多相关内容
  • STM32F103C8T6模块外设资源分布图.jpeg STM32F103C8T6模块外设资源分布图.jpeg STM32F103C8T6模块外设资源分布图.jpeg STM32F103C8T6模块外设资源分布图.jpeg STM32F103C8T6模块外设资源分布图.jpeg STM32F103C8T6...
  • STM32F103C8T6_IIC.zip

    2021-08-07 17:58:02
    可以检测单击、双击、连按
  • 本参考手册针对应用开发,提供关于如何使用STM32F101xx、STM32F102xx、STM32F103STM32F105xx/STM32F107xx 微控制器的存储器和外设的详细信息。在本参考手册中 STM32F101xx 、 STM32F102xx 、 STM32F103STM...
  • 与文章对应,基于STM官方例程,用于生成TIM3外设的PWM波,占空比分别为50%,37.5%,25%,12.5%。希望能够帮助到大家
  • 程序通过keil5软件编写,你可以通过串口发送指令,来控制STM32F103C8T6单片机,并且通过串口返回LED的状态。(注意:程序中我使用的是PB8引脚和USART1串口。结和自己情况可以改变程序中的引脚,同时你也可以在引脚上...
  • STM32F103C8T6手册.pdf

    2019-06-16 23:17:53
    STM32F103C8T6中文手册。
  • 这是一个STM32F103C8T6读取DS18B20串口显示程序;使用串口1,波特率为115200;ds18b20数据引脚接单片机的PA0
  • STM32F103C8T6串口打印

    2015-05-21 22:37:10
    使用STM32F103C8T6的USART实现串口打印输出,方便代码调试。对串口传上来的信息进行处理。同时对其常用外设如ADC,DMA,CAN,TIM的PWM进行了初始化,并串口打印初始化信息方便后续开发使用。特别适用于STM32F103C8T6的...
  • 使用STM32F103C8T6的SPI与外设通信遇到的一些问题和经验教训

    项目场景:

    提示:这里简述项目相关背景:

    使用STM32F103C8T6的SPI与外设通信遇到的一些问题和经验教训


    问题描述

    项目中的问题:

    STM32F103C8T6的SPI与外设DAC进行数据通信时遇到一些问题,导致无法控制外设执行相应的功能。遇到的问题如下:
    1、SPI1_SCK时钟引脚始终无法输出时钟信号
    2、SPI2_SCK设置SPI2默认空闲状态下是高电平,时钟信号可以输出,但是时钟为低电平时无法拉低到0V反而是在1V左右;

    原因分析:

    针对问题1:

    在这里插入图片描述
    可以看到这里的SPI1_SCK引脚和芯片的调试管脚是同一个,芯片上电默认该引脚为调试引脚,电平为高电平,导致芯片的SPI1_SCK是无法拉低的。该问题在stm32芯片手册上有提及:
    在这里插入图片描述
    找到芯片的复用重映射和调试I/O配置寄存器(AFIO_MAPR)的24:26位,可以看到相关解释说明:即通过修改这3位的配置可以关闭调试引脚配置,释放响应的IO口。实际使用中通过开启AFIO辅助时钟,将SWJ_CFG配置为2或者3即可当做普通IO使用,但如想作为SPI1时钟引脚,还需在MAPR寄存器开启SPI1的重映射!

    在这里插入图片描述在这里插入图片描述
    开启SPI1的重映射才会有时钟信号输出!
    在这里插入图片描述

    针对问题2:

    SPI2_SCK低电平无法拉低的问题,是由于SPI2的相连接的外设DAC的时钟引脚和片选引脚之间有个焊锡给连接起来了,导致了电平无法拉低。

    解决方案:

    提示:针对问题1:

    配置SPI1时关闭调试引脚PB3,开启SPI1的重映射功能即可

    RCC->APB2ENR |= 1<<0; //开启AFIO辅助时钟
    AFIO->MAPR |= 2<<24; //关闭JTAG,启用SW模式
    AFIO->MAPR |= 1<<0; //开启重映射:
    注意不建议配置为JTAG-DPDP,关闭SW-DP,那会导致芯片锁死,无法进行程序下载和程序调试!!
    如芯片不小心被锁死可以通过以下方法尝试解决:
    1、首先将电路板供电断开,包括3.3V电源供电和JLINK调试线供电等所有供电电源关闭;
    2、找到芯片的BOOT0引脚,将BOOT0拉高。可以通过导线连接到一个3.3V的引脚,注意不要接入高于3.3V电压,否则烧坏板子!
    在这里插入图片描述
    3、BOOT0拉高以后,保持住这个高电平,打开电源,重新给板子上电。
    4、接上JLink或者STLink,下载程序。下载完成以后,断开BOOT0,恢复低电平。
    详细方法和解释可以参考:
    原文链接:https://blog.csdn.net/Ace_Shiyuan/article/details/60139865

    附SPI的一般初始化配置
    void SPI1_Init(void)
    {

    RCC->APB2ENR |= 1<<0; //开启AFIO辅助时钟
    AFIO->MAPR |= 2<<24;   //关闭JTAG
    AFIO->MAPR |= 1<<0;    //开启重映射
    RCC->APB2ENR|=1<<3;  	//PORTB时钟使能,根据LMH6518的SCK\SDI连接线实际使用的IO口确定
    RCC->APB2ENR|=1<<12;   	//SPI1时钟使能 
    
    //SPI口初始化配置
    GPIOB->CRL&=0XFF0F0FFF; //寄存器对应位清空
    GPIOB->CRL|=0X00B0B000;	//PB3\PB5复用推挽模式,最大速度50M,对应SCK\SDO 
    SPI1->CR1|=0<<11;		//8bit数据格式	
    SPI1->CR1|=0<<10;		//全双工模式	
    SPI1->CR1|=1<<9; 		//软件nss管理
    SPI1->CR1|=1<<8;  
    
    SPI1->CR1|=1<<2; 		//SPI主机
    SPI1->CR1|=1<<1; 		//空闲模式下SCK为1 CPOL=1
    SPI1->CR1|=1<<0; 		//数据采样从第二个时间边沿开始,CPHA=1  
    
    //对SPI1属于APB2的外设.时钟频率最大为36M.
    SPI1->CR1|=7<<3; 		//Fsck=Fpclk1/8
    SPI1->CR1|=0<<7; 		//MSBfirst   
    SPI1->CR1|=1<<6; 		//SPI设备使能
    SPI1_ReadWriteByte(0xff);//启动传输,提供SCK时钟
    
    展开全文
  • STM32F103C8T6单片机简介

    万次阅读 多人点赞 2020-11-27 13:54:06
    The STM32F103xx medium-density performance line family incorporates the high-performance ARMCortex-M3 32-bit RISC core operating at a 72 MHz frequency, high-speed embedded memories (Flash memory up to...

    一、简介

            STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。除了被我们熟知的STM32,ST公司还有SPC5X系列、STM8系列等,具体参数如下:

    内核Cortex-M3
    Flash64K x 8bit
    SRAM20K x 8bit
    GPIO37个GPIO,分别为PA0-PA15、PB0-PB15、PC13-PC15、PD0-PD1
    ADC

    2个12bit ADC合计12路通道,外部通道:PA0到PA7+PB0到PB1,

    内部通道:温度传感器通道ADC_Channel_16和内部参考电压通道ADC_Channel_17

    Timers

                            4个16bit定时器/计数器,分别为TIM1、TIM2、TIM3、TIM4

                                    TM1带死区插入,常用于产生PWM控制电机

    2个看门狗定时器(独立看门狗IWDG、窗口看门狗WWDG)
    1个24bit向下计数的滴答定时器systick
    工作电压、温度2V~3.6V、-40°C ~ 85°C
    通信串口

                                            2*IIC,2*SPI,3*USART,1*CAN

    系统时钟内部8MHz时钟HSI最高可倍频到64MHz,外部8MHz时钟HSE最高可倍频到72MHz

            ARM公司在ARM11以后改用Cortex命名,并分成A、R和M三类,M系列有M0、M0+、M3、M4、M7。 Cortex-M3是ARM公司推出的基于ARMv7架构的MCU内核,ST公司在此内核的基础上完成了USART、DMA、GPIO等外围电路的设计。在M系列不同内核开发下的STM32,大致可分成低功耗系列、主流系列、高性能系列3个部分,其具体信息如下图所示:

            相同系列的内核一般相同,如F1系列都采用Cortex-M3内核开发,但根据Flash大小不同可将STM32分成小容量产品(<64K)、中等容量产品(介于64K-128K)、大容量产品3个部分,各部分容量产品在使用标准库SPL开发时需要使用不同的启动文件并在预编译处做好修改,其具体信息如下图所示:

            STM32F103C8T6整个系统结构可以分为由ARM公司设计的Cortex-M3内核和ST公司在此基础上优化的总线矩阵、DMA(Direct Memory Access,直接内存读取)、AHB、APB1以及APB2上挂载的外设等两个部分,详细结构如下图所示:

            Cortex-M3摒弃了冯· 诺依曼结构(普林斯顿结构),采用了将指令存储和数据存储分开的 的哈佛结构(Harvard Architecture ),这样一来Cortex-M3同时拥有了独立的32-bit指令总线和32-bit数据总线,数据访问将不再占用指令总线,同时读取指令和数据后提升了MCU运行速度。冯诺依曼和哈弗结构的宏观对比如下图所示:
            Cortex-M3是一个 32 位处理器内核,正因如此,STM32才被称作为32-bit微控制器,他拥有32条地址总线,也就是说最大寻址空间为2^{32}=2^{2}*2^{30}=4GByte。此外,Cortex-M3的寄存器是32 位的,存储器接口也是 32 位的,其详细结构如下图所示:

    -------------------------------------------------------------------------------------------------------------------------------

    点击跳转:相关学习资料(CSDN)

    百度网盘:https://pan.baidu.com/s/1ok8i8YeiNITmnNs-QEPVqw 提取码:1234

    --------------------------------------------------------------------------------------------------------------------------------

    二、最小系统板

            或许大家有经常听起过最小系统板这个词儿,那么什么是最小系统板呢?其实最小系统板就是一个最精简的电路,精简到只能维持MCU的最基本的正常工作。最小系统一般由外部复位电路、外部时钟电路以及MCU本体构成,除此之外没有其他诸如蓝牙、外置EEPROM、时钟芯片DS1302、SPI接口显示屏等外接设备。(注:STM32支持内部时钟和上电复位,但从传统意义上讲最小系统就是由外部复位电路、外部时钟电路以及MCU本体构成。)我在淘宝上买了一块STM32F103C8T6的最小系统板,板子的设计很精致。喏,它长这个样子:

            如果你对最小系统仍一知半解,那你看看下面这个正点原子开发的开发板就能够明白,最小系统是真的精简到不能再精简了。

            其实淘宝买来的最小系统板和10块钱包邮的那个蓝色最小系统板区别不大,只是将一些引脚引出好插诸如显示屏类的外设。板子设计的很巧妙,所有引脚都引出来了,同时预留四个接口方便接入显示屏等设备,预留了SWD调试接口,可以使用ST-LINK下载程序与仿真。

            跟STC89C52RC单片机不一样的是,STM32F103C8T6的GPIO有8种模式,其中包含上拉、下拉输入模式,所以外接按钮时可不设计上下拉电阻。根据他的原理图显示:按键KEY0一端接到3.3V的VCC,一端接到PA0引脚。发光二极管LED0一端也同样经1KΩ电阻接到3.3V的VCC,另一端则接到PC13上。因此,想要让二极管发光的话需要让PC13输出低电平。STM32最大工作电压3.6V,使用了LDO(低压差线性稳压器)将输入电压VIN降到3.3v给微控制器供电。3.3V和GND之间的4个0.1uf的旁路电容(去除高频交流信号)接到了芯片的4个VDD和4个VSS上(WHAT?芯片为啥整四个VDD和四个VSS?我猜应该是增强供电能力,保证供电的可靠性)。

    三、命名规则

            我在网上找到了STM32F103中文手册,单片机命名原理如下图所示:

    四、引脚排布&引脚复用

            根据命名规则可知,STM32F103C8T6中的C代表着这款芯片有48个引脚,其引脚排布如下图所示:

            STM32微控制器有着丰富的功能,仅靠48个引脚是不够分配所有功能的,所以有的引脚可以实现好几种功能,这就叫引脚复用。一般而言,大部分引脚的第一功能是GPIO(通用输入输出口)。但值得注意的是:PA13、PA14、P15、PB3、PB4、PC14、PC15、PD0、PD1的默认功能并不是GPIO,使用时需要开启AFIO时钟,注意一下这一点。B站某UP制作了一个直观的图片,如下图所示:

    图片来源:公众号"电子开发学习"

            官方手册提供的STM32F103系列微控制器引脚的默认功能如下图所示:

    五、程序下载

            STM32单片机支持3种程序下载方式,根据原理不同可分为ISP串口下载(使用USB-TTL接PA9、PA10)、SWD下载(使用ST-LINK接PA13、PA14)、JTAG下载(使用JLINK接PA13、PA14、PA15、PB3、PB4)。

    1.ISP下载

            ISP的全程是In-System Programming,在线系统编程的意思。STM32单片机一般可通过UART1引脚进行程序烧录,烧录的时候需要配合BOOT0、BOOT1接地与否来实现。BOOT0、BOOT1可以组合出四种状态,不同位置的含义如下图所示,其中X是无关项。

            使用ISP串口下载前,将单片机上电之前需要先用跳线帽把BOOT0短接到1的位置,BOOT1短接到0的位置,即系统存储器模式,然后才能通过串口下载程序。ISP串口下载完成后断电,在单片机上电之前需要先用跳线帽把BOOT0短接到0的位置,即主闪存存储器模式。

            由于单片机使用的TTL电平通信协议,与电脑的USB口进行串口通信时需要使用转串口芯片,常见的有CH340系列(如CH340N)、FT232、PL2303等等,下图以CH340T为例。

            下载器GND与单片机GND相连(连一个就行),下载器3.3V与单片机3.3V相连(或者下载器5V与单片机VIN相连)、下载器RXD与单片机PA9(U1TX)相连,下载器TXD与单片机PA10(U1RX)相连。

            了解接线后,可以尝试编译下载。下载软件有很多,ST官方出了Flash Loader Demonstrator软件用于程序下载,国内也有一款FLYMCU的下载软件。

    Flash Loader Demonstrator

    2.SWD下载

            使用SWD接口下载只需要连接3.3V(如果烧录程序的板子自带供电的话3.3V引脚也不用连)、GND、SWDIO(PA13)、 SWCLK(PA14)、RST(非必要连线),可以从淘宝购买十几块的ST-LINK下载器(这种U盘形状的其实不是ST公司出品的,但是烧录了他们的固件,也是可以用滴)。使用SWD接口除了可以烧录程序外,还可以实现在线仿真(debug),仿真过程可以监视寄存器等数据,非常适合软件开发(找问题)。值得注意的是,ST-LINK/V2只支持给自家的STM32和STM8烧录程序,不支持为其他公司的单片机烧录程序(即使同样搭载Cortex-M3内核)。

    ST-LINK/V2

    3.JTAG下载

            JTAG接口需要使用TMS(模式选择)、TCK(时钟)、TDI(数据输入)、TDO(数据输出)、nTRST(复位,非必要),对应到STM32F103C8T6上就是PA13(TMS)、PA14(TCK)、PA15(TDI)、PB3(TDO)、PB4(nTRST)引脚,这些引脚第一功能就是JTAG接口,这就是上面所说的为什么这些引脚不能简单的当GPIO用。采用JTAG下载时可以使用J-LINK下载器(正版SEGGER的J-LINK价格比较昂贵,国内仿制的建议买V9版本以上),也可以使用ST公司原厂或国内仿制的带JTAG接口的ST-LINK/V2(如正点原子推出的,不过还是好贵,呜呜呜)。不过JTAG能实现的功能SWD一般也能实现,我比较懒,一般不使用这种下载接口。

    J-LINK
    ST-LINK/V2

            如果我们不需要使用JTAG下载,但GPIO资源紧张或PCB设计时已经使用了这些第一功能为JTAG的引脚,那么我们就需要关闭JTAG。比如说我要使用GPIOA15作为GPIO口,那么代码层面需要这样实现:

        GPIO_InitTypeDef GPIO_InitStructure;
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//使能PORTA时钟
    	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);// 关闭JTAG但使能SWD
    	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15;//PA15
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
     	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO

    详细关闭方法:见另一位博主的《STM32 JTAG调试》

    六、RTT

            RTT的全称是Real Time Transfer,翻译过来就是实时传输。为什么给大家介绍这个呢,上面有讲到J-LINK、ST-LINK等可以下载程序,也可以在线仿真。那么问题来了,他们直接支持串口通信嘛?答案是不可以!!!不过别慌,针对这个问题SEGGER公司推出了共享内存技术,这个功能可以省去外接使用USART进行串口数据测试,灰常方便。不过由于RTT是SEGGER公司推出的,所以这个是需要使用J-LINK V8版本及以上的调试器的,如果不差钱的话,可以优先考虑J-LINK。RTT支持所有搭载ARM Cortex-M0/M0+/M1/M3/M4/M7/M23/M33内核的MCU,不局限于STM32。

    SEGGER官网

             不过使用RTT功能是需要往工程文件里添加SEGGER提供的源代码的,官网安装包:" data-link-title="<官网下载>"><官网下载>详细的安装与使用教程见《硬汉哥分享的资料》

            导入源代码后可以在程序中使用以下函数,这些函数根据描述看很容易知道他的作用:

    函数名描述
    SEGGER_RTT_Read()Read data from an input buffer.
    SEGGER_RTT_Write()Write data to an output buffer.
    SEGGER_RTT_WriteString()Write a zero-terminated string to an output buffer.
    SEGGER_RTT_printf()Write a formatted string to an output buffer.
    SEGGER_RTT_GetKey()Get one character from input buffer 0.
    SEGGER_RTT_HasKey()Check if a character is available in input buffer 0.
    SEGGER_RTT_WaitKey()Wait for a character to be available in input buffer 0 and get it.
    SEGGER_RTT_ConfigUpBuffer()Configure an up (output) buffer.
    SEGGER_RTT_ConfigDownBuffer()Configure a down (input) buffer.
    SEGGER_RTT_Init()Initialize RTT Control Block structure when using RAM only targets.
    SEGGER_RTT_SetTerminal()Set the "virtual" Terminal to use for output on channel 0 via Write and WriteString.
    SEGGER_RTT_TerminalOut()Send a zero-terminated string via a "virtual" terminal.

             最后,使用RTT需要在电脑上安装J-Link RTT Viewer、J-Link RTT Client、J-Link RTT Logger,这3个终端可以选择自己喜欢的安装使用。 

    RTTViewer

    七、RTOS

            RTOS(Real-time operating system)是实时操作系统的总称,目前市面上有freeRTOS、RT-Thread、UCOS-III等多种实时操作系统,到了STM32这种复杂而强大的硬件层面,程序员将不再仅仅拿它当传统的MCU来跑裸机程序(裸机是指没有用上RTOS的程序),而是开始考虑程序的协调性和并行多任务(并不是真正意义上的并行,因为单核同一时间只能处理一件事情)。RTOS是一个有趣的东西,如果大家感兴趣我后期会考虑更新一篇有关RTOS的文章,大家目前可以去freeRTOS官网看看或者阅读其他作者的文章。 

    八、官网原文介绍

            The STM32F103xx medium-density performance line family incorporates the high-performance ARM®Cortex®-M3 32-bit RISC core operating at a 72 MHz frequency, high-speed embedded memories (Flash memory up to 128 Kbytes and SRAM up to 20 Kbytes), and an extensive range of enhanced I/Os and peripherals connected to two APB buses. All devices offer two 12-bit ADCs, three general purpose 16-bit timers plus one PWM timer, as well as standard and advanced communication interfaces: up to two I2Cs and SPIs, three USARTs, an USB and a CAN.

            The devices operate from a 2.0 to 3.6 V power supply. They are available in both the –40 to +85 °C temperature range and the –40 to +105 °C extended temperature range. A comprehensive set of power-saving mode allows the design of low-power applications.
    The STM32F103xx medium-density performance line family includes devices in six different package types: from 36 pins to 100 pins. Depending on the device chosen, different sets of peripherals are included, the description below gives an overview of the complete range of peripherals proposed in this family.
    These features make the STM32F103xx medium-density performance line microcontroller family suitable for a wide range of applications such as motor drives, application control, medical and handheld equipment, PC and gaming peripherals, GPS platforms, industrial applications, PLCs, inverters, printers, scanners, alarm systems, video intercoms, and HVACs.

            主要特性

    • ARM®32-bit Cortex®-M3 CPU Core
      • 72 MHz maximum frequency,1.25 DMIPS/MHz (Dhrystone 2.1) performance at 0 wait state memory access
      • Single-cycle multiplication and hardware division
    • Memories
      • 64 or 128 Kbytes of Flash memory
      • 20 Kbytes of SRAM
    • Clock, reset and supply management
      • 2.0 to 3.6 V application supply and I/Os
      • POR, PDR, and programmable voltage detector (PVD)
      • 4-to-16 MHz crystal oscillator
      • Internal 8 MHz factory-trimmed RC
      • Internal 40 kHz RC
      • PLL for CPU clock
      • 32 kHz oscillator for RTC with calibration
    • Low-power
      • Sleep, Stop and Standby modes
      • VBAT supply for RTC and backup registers
    • 2 x 12-bit, 1 μs A/D converters (up to 16 channels)
      • Conversion range: 0 to 3.6 V
      • Dual-sample and hold capability
      • Temperature sensor
    • DMA
      • 7-channel DMA controller
      • Peripherals supported: timers, ADC, SPIs, I2Cs and USARTs
    • Up to 80 fast I/O ports
      • 26/37/51/80 I/Os, all mappable on 16 external interrupt vectors and almost all 5 V-tolerant
    • Debug mode
      • Serial wire debug (SWD) & JTAG interfaces
    • 7 timers
      • Three 16-bit timers, each with up to 4 IC/OC/PWM or pulse counter and quadrature (incremental) encoder input
      • 16-bit, motor control PWM timer with dead-time generation and emergency stop
      • 2 watchdog timers (Independent and Window)
      • SysTick timer 24-bit downcounter
    • Up to 9 communication interfaces
      • Up to 2 x I2C interfaces (SMBus/PMBus)
      • Up to 3 USARTs (ISO 7816 interface, LIN, IrDA capability, modem control)
      • Up to 2 SPIs (18 Mbit/s)
      • CAN interface (2.0B Active)
      • USB 2.0 full-speed interface
    • CRC calculation unit, 96-bit unique ID
    • Packages are ECOPACK®

    九、文章小结

            STM32F103C8T6单片机采用LQFP48封装设计,芯片一共引出44只引脚,其中A口有A0-A15共16个引脚,B口有B0-B15共16个引脚,C口有C13-C15共3个引脚,D口有D0-D1共两个引脚。值得注意的是最小核心板C14和C15接了32.768K晶振,D0和D1接了8MHz晶振,一般不要用做IO口。如果实在要用只能去掉外部晶振电路(使用HSI、LSI),通过重映射和配置AFIO_MAPR寄存器实现。

            其实在学习STC15系列单片机后对STM32单片机一度有恐惧感,STC15F2K60S2单片机的寄存器我觉得已经很多了,STM32那么多寄存器大家是怎么记住的。现在开始学习才了解到官方有出固件库供大家调用,根据推出时间不同可分早期固件库(V3.0.0以下)、标准外设库(点我跳转)HAL库(点我跳转)LL库(LL库包含在HAL库里了) 四种。目前最新的标准库版本为V3.5.0,调用官方提供的API进行开发,为ST公司2011年发布,停更已有10年的时间了。使用HAL可进行图形化开发,感官上更加生动形象。不过由于HAL库旨在解决标准库在不同系列单片机上不同通用的问题,其代码执行效率没有标准库高。如果编译器优化等级低,产生HEX文件会比较大。后来ST针对此问题推出了LL库,LL库大多数API函数是直接调用寄存器,提高了代码的执行效率。不过,一般推出的时间越久,我们所能搜集到的资料就越丰富,我目前在学习标准库的开发方式,建议大家根据自身情况做出选择。

            更多资料可上ST公司的中文官网:首页 - STMicroelectronics寻找。

            推荐几个学习论坛:

            1.正点原子:OpenEdv-开源电子网-正点原子论坛

            2.硬石论坛:硬石电子 - 社区

            3.硬汉嵌入式论坛:硬汉嵌入式论坛 - Powered by Discuz!

            4.野火论坛:野火电子论坛 -

            5.51黑电子论坛:51黑电子论坛-单片机 电子制作DIY MCU 嵌入式技术学习

            6.STM32 Arduino:STM32 Arduino-Arduino中文社区 - Powered by Discuz!

    展开全文
  • NS32F103X8和NS32F103XB标准型MCU系列使用高性能的ARM Cortex-M3 32 位的RISC内核,工作频率为72MHz,内置高速存储器(高达128K字节的闪存和20K字节的SRAM),丰富的增强I/O端口和联接到两条APB总线的外设。...
  • stm32f103C8T6模板.zip

    2021-08-22 22:52:05
    stm32f103c8t6的模板,已经加入了一些常用的库并且测试通过,附带一份c8t6的datasheet,如果大家需要新建其他型号32的工程,只需更改CORE目录下的startup_stm32f10x_md.s文件就好(ld小容量,md中容量,hd大容量),...
  • STM32F103C8T6 内核外设Systick与普通外设中断优先级比较 最近有网友经实验验证(网友的验证.),Systick虽然作为与CPU紧耦合的内核外设,但其中断优先级并不比普通外设要高,并不因为它是内核外设而特殊,它还是...

    STM32F103C8T6 内核外设Systick与普通外设中断优先级比较


    最近有网友经实验验证( 网友的验证.),Systick虽然作为与CPU紧耦合的内核外设,但其中断优先级并不比普通外设要高,并不因为它是内核外设而特殊,它还是遵循中断优先级高低的规则来响应。就网友的结论是没问题,但网友的实验现象感觉有点出入,和自己想的不太一样,出严谨,按网友的代码在stm32f103的芯片是实验了一下,由于网友的是stm32f429IGT6的芯片,程序上会有点不一样,但都是stm32系列的想来问题不大,同事我的项目是用M3的芯片,探究也是M3的内外中断的区别,终于还是用M3的来验证吧。

    实验环境条件如下:MDK v5.30.0.0,STM32F103C8T6的MCU。

    设置Systick的中断优先级为7(1,3),100ms产生一个中断,初始化Systick代码如下:

    void delay_init()
    {
    //	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);	//选择外部时钟  HCLK/8
    //	fac_us=SystemCoreClock/8000000;				//为系统时钟的1/8  
    	if (SysTick_Config(SystemCoreClock / 10))
    	{ 
    		/* Capture error */ 
    		while (1);
    	}
    }	
    
    
    static __INLINE uint32_t SysTick_Config(uint32_t ticks)
    { 
      if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
                                                                   
      SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
    //  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
    	 NVIC_SetPriority (SysTick_IRQn, 7);  /* set Priority for Cortex-M0 System Interrupts */
      SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
      SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                       SysTick_CTRL_TICKINT_Msk   | 
                       SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
      return (0);                                                  /* Function successful */
    }
    

    Systick的中断服务函数如下:

    void SysTick_Handler(void)
    {	
    		LED_SYS=!LED_SYS;
    		Delayms(5);//普通的软件延时
    }
    void Delayms(u16 ms)
    {
      u16 i,j;
      u8 k;
      for(i=0;i<ms;i++)
        for(j=0;j<0x0500;j++) k++;
    }
    

    然后配置两个按键KEY0和KEY1,产生两个外部中断EXTI(下降沿触发),NVIC的Group分组为
    Group2。分别设置KEY0的外部中断优先级为15(2,2),KEY2的外部中断优先级为3(0,2),代码如下:

    //外部中断0服务程序
    void EXTIX_Init(void)
    {
     
     	EXTI_InitTypeDef EXTI_InitStructure;
     	NVIC_InitTypeDef NVIC_InitStructure;
    
        KEY_Init();	 //	按键端口初始化
    
      	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	//使能复用功能时钟
    
        //GPIOE.2 中断线以及中断初始化配置   下降沿触发
      	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
    
      	EXTI_InitStructure.EXTI_Line=EXTI_Line0;	//KEY1
      	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
      	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
      	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
      	EXTI_Init(&EXTI_InitStructure);	 	//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    
       //GPIOE.3	  中断线以及中断初始化配置 下降沿触发 //KEY1
      	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);
      	EXTI_InitStructure.EXTI_Line=EXTI_Line1;
      	EXTI_Init(&EXTI_InitStructure);	  	//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    
     
    
    
      	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;			//使能按键WK_UP所在的外部中断通道
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;	//抢占优先级2, 
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;					//子优先级3
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								//使能外部中断通道
      	NVIC_Init(&NVIC_InitStructure); 
    
        NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;			//使能按键KEY2所在的外部中断通道
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;	//抢占优先级2, 
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;					//子优先级2
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								//使能外部中断通道
      	NVIC_Init(&NVIC_InitStructure);
    
    
     
    }
    
    //按键初始化函数
    void KEY_Init(void) //IO初始化
    { 
     	GPIO_InitTypeDef GPIO_InitStructure;
     
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);//使能PORTA,PORTE时钟
    
    	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;//KEY0
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
     	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA0,GPIOB1
    	
    	
    	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1;//KEY1
    	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA0,GPIOB1
    }
    

    KEY0和KEY1的外部中断服务函数如下:

    
    //外部中断0服务程序 
    void EXTI0_IRQHandler(void)
    { 
    	Delayms(10);//消抖
    	if(KEY0==0&&EXTI_GetITStatus(EXTI_Line0) != RESET)	 	 //WK_UP按键
    	{				 
    		LED_R=!LED_R;	
    		while(1)
    		{
    			Delayms(10);
    		}
    	}
    	EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位  
    }
     
    //外部中断1服务程序
    void EXTI1_IRQHandler(void)
    {
    	Delayms(10);//消抖
    	if(KEY1==0&&EXTI_GetITStatus(EXTI_Line1) != RESET)	  //按键KEY2
    	{
    		LED_W=!LED_W;
    		while(1)
    		{
    			Delayms(10);
    		}
    	}		 
    	EXTI_ClearITPendingBit(EXTI_Line1);  //清除LINE2上的中断标志位  
    }
    

    最后是主函数的代码:

    int main(void)
     {		
     
    	
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	 delay_init();	    	 //延时函数初始化	  
    	uart_init(115200);	 //串口初始化为115200
     	LED_Init();		  		//初始化与LED连接的硬件接口
    	BEEP_Init();         	//初始化蜂鸣器端口
    //	KEY_Init();         	//初始化与按键连接的硬件接口
    	EXTIX_Init();		 	//外部中断初始化
    	while(1)
    	{	    
    		printf("OK\r\n");	
    //		delay_ms(1000);	  
    	}
     }
    

    实验设计的条件如下:

    中断KEY0SystickKEY1
    优先级(抢占、响应)10(2,2)7(1,3)2(0,2)
    现象亮红灯亮绿灯亮白灯

    另外,从代码可以看出,KEY0和KEY1的中断服务函数都是亮灯后死循环(只是为了做实验而已,中断服务函数里绝不允许放死循环,应该服从“快进快出”的原则),Systick的中断服务函数是亮灯后延时一段时间,每次进入Systick的中断服务函数灯的控制状态翻转一次,通过灯的一闪一闪的发光Systick的中断的进出。(亮灯都是控制的亮不同一个灯,方便区分当前状态)

    实验现象如下:
    程序下到板子里开始跑后,未操作前,一直绿灯闪烁,当第一次按下按键0后,会亮红灯,再按按键0,无反应(还是亮红灯绿灯闪烁);然后按下按键1,亮白灯,一直亮白灯,再按按键1,无反应(还是亮白灯且红灯亮,绿灯不在闪烁)。

    实验现象分析:
    未操作前,亮红灯,因为每100ms产生一次Systick中断,绿灯状态改变一次,呈现绿灯闪烁;

    当按下KEY0后,会亮红灯然后绿灯闪烁,这是因为KEY0的中断优先级虽然比Systick低,但是当执行完Systick中断后还是会去执行KEY0的中断,称为“咬尾中断”,然后当Systick产生中断后再返回Systick中断;再按KEY0,无反应,是因为代码中在退出按键1中断前加了个死循环,未清除KEY0的中断标志位,所以进不去;

    然后按下KEY1,一直亮白灯和红灯,绿灯不在闪烁。是因为KEY1的中断优先级比Systick高和KEY0的中断,能抢占,而且KEY1的中断里也加了个死循环,退不出来。也就是说,当KEY1的中断在执行的时候,虽然Systick的时间到了,产生了Systick中断,但还是打断不了KEY1的中断,因为优先级没它(KEY1)高。

    实验结论:
    Systick虽然作为与CPU紧耦合的内核外设,但其中断优先级并不比普通外设要高,并不因为它是内核外设而特殊,它还是遵循中断优先级高低的规则来响应。

    实验注意:
    设置Systick中断优先级的时候,不能通过修改__NVIC_PRIO_BITS的大小,比如改成3,使Systick中断优先级为7;同时内核的中断优先级的寄存器和外设中断优先级的存储寄存器不同,不能用设置外设中断优先级的方法设置内核中断优先级,而应该和上面代码一样,采用直接赋值的办法。因为__NVIC_PRIO_BITS表示的是M3所有中断分组所用的位数,不是普通的设置成Systick中断优先级的数字;

    另外,NVIC分组设置,最好设置为Group2,两位表示抢占优先级(主优先级),两位表示响应优先级(子优先级),方便对比。

    同时如果写的程序没有调用SysTick_Config()函数也就是没调用NVIC_SetPriority() 函数,程序的优先级会默认为0(不管是内核中断还是外设中断,只要没设置中断优先级,中断优先级都默认为0,同为0级后优先按官方手册中的中断排列顺序来)。在一些带UCOSII的stm32案例中是没有调用NVIC_SetPriority() 函数的,但SysTick中断的优先级不是0,而是15,这是因为UCOSII系统的官方代码中,用汇编对SysTick中断寄存器进行了优先级设置,和st官方NVIC_SetPriority() 函数是一样的。

    汇编对SysTick中断寄存器进行了优先级设置见下图:
    1.未设置SysTick中断寄存器
    未设置SysTick中断寄存器

    2.设置SysTick中断寄存器后
    设置SysTick中断寄存器
    实验搭建的硬件平台:
    在这里插入图片描述

    展开全文
  • STM32F103C8T6和C6T6的区别

    千次阅读 2022-03-07 19:36:01
    最近STM32芯片涨价,好多网店卖的单片机都变成了C6T6,不过虽然引脚一样,使用中还是发现了一些区别。下面介绍一下: 1.C6T6没有串口3(USART3); 2.C6T6没有通用定时器TIM4; 3.C6T6没有串行外设接口SPI2; 4.C6...
  • STM32F103c8t6超频

    2021-08-27 16:34:38
    STM32F103c8t6超频 STM32F103C8T6官方说的主频为72MHz。但为了好奇,我决定去网上买一个STM32f103最小系统进行超频。如下图所示: 像上图这种最小系统,一般都有一个LED灯,接在STM32的PC13上。一开始,我想通过LED...
  • STM32F103c8t6点灯

    2022-01-28 12:25:51
    首先我们需要用到STM32CubeMX,Keil5,STM32F103C8T6原理图。 打开STM32CubeMX新建项目 在左上角找到STM32F103c8t6 加载完后会出现它的引脚图,打开我们的原理图,找到LED所在的引脚PC13 在引脚图上选择PC13...
  • STM32F103C8T6实现流水灯

    2021-10-24 14:33:17
    STM32F103C8T6实现流水灯 目录STM32F103C8T6实现流水灯一、实验原理二、c语言实现三、总结四、参考五、附件 一、实验原理 1.1 stm32f103c8t6介绍 STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核...
  • MM32F103C8T6使用高性能的ARM CortexTM-M3 为内核的32 位微控制器,工作频率最高可达168MHZ,内置高速存储器,丰富的增强型I/O 端口和外设连接到外部总线。该产品系列工作电压为2.0V~ 5.5V,工作温度范围包含-40◦C~...
  • STM32F103中外部中断优先级只能用高四位,而且数值越小,优先级越高。
  • 寄存器 控制STM32F103C8T6 点亮LED灯

    千次阅读 2022-04-23 18:08:02
    寄存器 控制STM32F103C8T6 点亮LED灯
  • 读写内部Flash(介绍+附代码) - 竹风清 - 博客园 STM32用cube配置FATFS模式下SPI读写SD卡_Drive World的博客-CSDN博客 STM32 进阶教程 13 – FLASH的读写操作_张十三的博客-CSDN博客_stm32f103c8t6flash读写
  • 文章内容: 1. STM32F103C8T6 的 **Flash** 地址空间的数据读取。 2. STM32F103C8T6 自带的 **DAC 通道**,转换为模拟音频进行播放,并用示波器观察波形,用耳机/喇叭收听,评判音乐还原效果。
  • stm32f103c8t6只有20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始),运行一次写入8KB数据,总计复位运行代码4次,将32KB数据写入Flash。并验证写入数据的...
  • 目录 一、原理 1.原理图 2.原理 (1)当PC13为低电平时LED灯点亮 ...(2)通过配置一系列寄存器使PC13为低电平 ...2.APB2外设时钟使能寄存器(RCC_APB2ENR) ... STM32F103C8t6 LED0接PC13引脚(不同板子的引脚...
  • 根据时序图来配置stm32核心板的spi外设: 配置SPI为主模式: 配置步骤: 1. 通过 SPI_CR1 寄存器的 BR[2:0] 位定义串行时钟波特率。(数据传输速度,下图中fPCLK为spi所在的时钟总线的时钟频率,SPI1在APB2时钟总线...
  • 一、GPIOx端口的各寄存器地址和详细参数 (一)、GPIO的简介 每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位...注:以下来自STM32F103C8T6的中文手册 端口配置低寄存器(GPIOx_CRL) (x=A..E..
  • STM32 f103c8t6芯片简介芯片解密

    千次阅读 2022-03-21 11:17:37
    STM32F103c8t6,STM32F103rct6,STM32F103zet6,STM32F103vgt6,STM32F103rbt6, STM32F103vct6,STM32F103vet6,STM32F103c6t6,STM32F103c6,STM32F103r8t6, STM32F103vbt6芯片解密 STM32 F1系列基础型MCU满足了工业、...

空空如也

空空如也

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

stm32f103c8t6外设