Fun_Cheong's - 单片机外设
type: channel
link: https://funcheong.cn/index.php/tag/%E5%8D%95%E7%89%87%E6%9C%BA%E5%A4%96%E8%AE%BE/
items: c2000 基本通信外设使用笔记 （Driverlib)
items: C2000 epwm使用笔记 (Driverlib)
items: STM32——FMC/FSMC学习笔记

c2000 基本通信外设使用笔记 （Driverlib)
type: item
date: 2023-07-21T14:47:00+08:00
description: 简介在电力电子应用中单片机经常需要和各种外围设备进行通信，本文主要介绍几种常用的通信接口的使用方法低速时钟(LSPCLK)c2000的一些通信接口（McBSP、SCI、SPI）是将片上的低速时钟信号作为Bitclock的，低速时钟由系统时钟分频得到，默认是四分频，如果需要修改分频系数可以使用下面这个函数static inline void SysCtl_setLowSpeedClock(SysCtl_LSPCLKPrescaler prescaler)串行通信接口(SCI)SCI的发送和接收都有一个16字节的FIFO，还有一些常见的中断信号之类的，和其他串口区别不大捏妈，API手册SCI这块直接消失了，谢谢你，TI初始化设置GPIO//发送引脚 GPIO_setPadConfig(8,GPIO_PIN_TYPE_STD); GPIO_setPinConfig(GPIO_8_SCITXDA); GPIO_setQualificationMode(8,GPIO_QUAL_ASYNC); //接收引脚 GPIO_setPadConfig(9,GPIO_PIN_TYPE_STD); GPIO_setPinConfig(GPIO_9_SCIRXDA); GPIO_setQualificationMode(9,GPIO_QUAL_ASYNC);TI论坛上面有老哥说这个qualification不开也能用，笔者试了一下发现确实能用，按照TI的说法，这个qualification是用来防止在复杂环境下工作时受到各种噪声影响的，手册上面也让把这个打开，所以还是开了（重置SCI SCI_performSoftwareReset(SCIA_BASE);设置通信速率和帧格式波特率通过设置分频寄存器进行配置，手册给出了波特率的计算公式：BRR = (SCIHBAUD << 8) + (SCILBAUD)The SCI baud rate is calculated using the following equation:SCI Asynchronous Baud = LSPCLK / ((BRR + 1) *8)最大的可设置波特率是低速时钟频率除以十六使用Driverlib函数可以自动计算分频系数帧格式需要设置数据位数、停止位数和校验方式 SCI_setConfig(SCIA_BASE,50000000,115200,//低速时钟50MHz,波特率115200 (SCI_CONFIG_WLEN_8| //8位数据位 SCI_CONFIG_STOP_ONE| //1位停止位 SCI_CONFIG_PAR_NONE)); //无校验 设置FIFOSCI_enableFIFO(SCIA_BASE);//使能FIFO SCI_resetTxFIFO(SCIA_BASE);//重置FIFO SCI_resetRxFIFO(SCIA_BASE);设置中断下面这个是SCI的中断信号框图初始化中断向量表（如果没有初始化的话）Interrupt_enablePIE(); Interrupt_initModule(); Interrupt_initVectorTable();关中断DINT;注册中断服务函数，函数使用的中断号可以在hw_ints.h里面找到Interrupt_register(INT_SCIA_RX,Recv_Callback);//注册SCIA的串口接收中断服务函数使能中断Interrupt_enable(INT_SCIA_RX);//在CPU处使能SCIA串口接收中断 SCI_enableInterrupt(SCIA_BASE,SCI_INT_RXFF);//使能SCIA模块的接收中断设置FIFO中断条件，接收和发送可以分别设置SCI_setFIFOInterruptLevel(SCIA_BASE,SCI_FIFO_TX1,SCI_FIFO_RX1); //发送和接收FIFO都在接收到一个字节之后产生中断开中断EINT;其他通信外设的中断玩法和这个差不多，后面就不提了使能SCISCI_enableModule(SCIA_BASE);使用接收中断实现一个简单的echo功能__interrupt void Recv_Callback(void) { uint16_t recv_buffer[1]={0}; SCI_readCharArray(SCIA_BASE,recv_buffer,1); SCI_writeCharArray(SCIA_BASE,recv_buffer,1); SCI_clearOverflowStatus(SCIA_BASE); SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_RXFF); I…

C2000 epwm使用笔记 (Driverlib)
type: item
date: 2023-07-18T17:32:00+08:00
description: 介绍The enhanced pulse width modulator (ePWM) peripheral is a key element in controlling many of the powerelectronic systems found in both commercial and industrial equipment. These systems include digitalmotor control, switch mode power supply control, uninterruptible power supplies (UPS), and other forms ofpower conversion.增强型脉宽调制器(ePWM)外设是控制许多商业和工业设备中电力电子系统的关键元素，这些系统一般包括数字电机控制，开关电源控制，不间断电源控制和其他形式的功率转换系统由上图可见，c2000的epwm被分为了几个子模块，包括时基模块，比较模块，波形发生器模块等GPIO配置首先要配置epwm模块工作时需要使用到的引脚，把输出引脚配成推挽就行void GPIO_setPadConfig(uint32_t pin, uint32_t pinType)pinType的参数：GPIO_PIN_TYPE_STD specifies a push-pull output or a floating inputGPIO_PIN_TYPE_PULLUP specifies the pull-up is enabled for an inputGPIO_PIN_TYPE_OD specifies an open-drain output pinGPIO_PIN_TYPE_INVERT specifies inverted polarity on an input把引脚分配给EPWMvoid GPIO_setPinConfig(uint32_t pinConfig)pinConfig的宏定义可以在pin_map.h里找到,不同的芯片的driverlib可能会有一点区别，比如28379是GPIO_0_EPWM1A,280049就变成了GPIO_0_EPWM1_A我也不知道为什么非要整个不一样的EPWM点灯流程首先禁用计数器的时钟信号SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);配置时基(Time-Base)设置分频系数（笔者这里设置了不分频，可以根据需求改）EPWM_setClockPrescaler(EPWM1_BASE,EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);This function sets the pre scaler(divider)value for the time base clock counter and the high speed time base clock counter. Valid values for pre-scaler and highSpeedPrescaler are EPWM_CLOCK_DIVIDER_X, where X is 1,2,4,8,16, 32,64 or 128. The actual numerical values for these macros represent values 0,1…7. The equation for the output clock is: TBCLK = EPWMCLK/(highSpeedPrescaler * pre-scaler)设置计数方向EPWM_setTimeBaseCounterMode(EPWM1_BASE,EPWM_COUNTER_MODE_UP);设置重装载值装载方式EPWM_setPeriodLoadMode(EPWM1_BASE,EPWM_PERIOD_SHADOW_LOAD);EPWM_PERIOD_SHADOW_LOAD 使用影子寄存器EPWM_PERIOD_DIRECT_LOAD 直接访问设置计数器重装载事件EPWM_selectPeriodLoadEvent(EPWM1_BASE, EPWM_SHADOW_LOAD_MODE_COUNTER_ZERO);设置重装载值EPWM_setTimeBasePeriod(EPWM1_BASE,10000);配置比较器(Counter Compare)设置比较值的装载事件EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_L…

STM32——FMC/FSMC学习笔记
type: item
date: 2023-01-11T11:18:00+08:00
description: 简介FSMC(Flexible Static Memory Controller，可变静态存储控制器)是STM32系列采用的一种新型的存储器扩展技术。在外部存储器扩展方面具有独特的优势，可根据系统的应用需要，方便地进行不同类型大容量静态存储器的扩展（还有一种用途是用来驱动并口屏）系统框图*本文使用的图片均出自STM32H750VB的参考手册，FMC的具体情况在不同型号的芯片内可能会有所不同。在STM32单片机中，FMC的作用相当于沟通了芯片内部的设备总线和外部存储器件，使得CPU能够通过总线访问到外部器件的内存。内存映射FMC内存框图FMC的内存被分为若干个内存块，其中内存块1拥有一个独立的2位片选信号，将该内存块分为了四个扇区，也就是支持最多连接四个内存设备。NOR/PSRAM设备的内存映射前文提到内存块1的2位片选信号由地址线的第27、28位控制。地址线的前26位用于访问外部内存设备中的指定位置。考虑到设备寄存器宽度不同，st官方给出了以上说明。在对外部通信过程中，若设备的寄存器宽度为16位，那么地址线的第26位将不被使用，32位寄存器同理，不使用第26、25位。同时，对于CPU而言，内存的单位仍然是一个字节，因此在使用外部设备的寄存器地址时应当将其地址左移相应位数。应用举例:ILI9341LCD驱动芯片ILI9341使用8080通信协议，STM32的FSMC使用该协议时要求用户指定地址线上的一位作为8080的数据、命令信号。实际上是将LCD当作了一种只有两个寄存器的SRAM芯片，从而将SRAM总线的通信转换成了8080.以下是正点原子写的驱动代码：//LCD地址结构体 typedef struct { u16 LCD_REG; u16 LCD_RAM; } LCD_TypeDef; //使用NOR/SRAM的 Bank1.sector1,地址位HADDR[27,26]=00 A18作为数据命令区分线 //注意设置时STM32内部会右移一位对齐! #define LCD_BASE ((u32)(0x60000000 | 0x00007FFFE)) #define LCD ((LCD_TypeDef *) LCD_BASE)结合上文不难得知LCD内存的“基地址”如何求取。