串行通信 软件仿真STM32与74LS164通信

发布者:size0109最新更新时间:2017-09-18 来源: eefocus关键字:串行通信  软件仿真  STM32  74LS164 手机看文章 扫描二维码
随时随地手机看文章

1、串行通信


2、常见的4种串行通信标准


3、对74LS164芯片的介绍

74LS164:串行转并行芯片,内部是1个8位的移位寄存器组成,由8个D触发器组成

缺点是:不带锁存寄存器,移位寄存器移位的过程会表现在164的输出引脚上,容易产生输出干扰。





4、用KEIL4进行软件仿真时,按正常步骤建立工程,然后在下图位置按照下图设置即可。


5、软件仿真:STM32与74LS164进行通信的程序如下:


  1. /************************************************************************************************** 

  2.  *  硬件平台:STM32F103VC 

  3.  *  学习重点:GPIOx的位绑定 

  4.  *  实现功能:软件仿真,实现STM32与“串行转并行芯片164”进行通信 

  5.  *  164不带锁存器,给它串行传数据时,内部移位寄存器的移位过程会在其并行输出引脚上表现出来 

  6.  *  Clear引脚低电平有效,接STM32的PB.0引脚  Clock上升沿有效,接STM32的PA.1引脚 

  7.  *  A&B 相与后作为164的串行输入引脚 

  8.  **************************************************************************************************/  

  9.   

  10.  /*============================================================================= 

  11.  * 位绑定公式: 

  12.  * 1、SRAM区域 :0X2200 0000 ----0X200F FFFF 

  13.  *    Aliasaddr = 0X22000000 + ( A -0X20000000 )*32 + n*4 

  14.  * 2、片上外设区域 :0X4200 0000 ----0X400F FFFF 

  15.  *    Aliasaddr = 0X42000000 + ( A -0X40000000 )*32 + n*4 

  16.  * 参数解释: 

  17.  *          Aliasaddr : 设置“端口GPIOx的第n位”的寄存器_相应位的实际地址 

  18.  *          A : 端口GPIOx的基地址(GPIOx_BASE) + 相应寄存器的偏移地址 

  19.  *          n : 配置的是相应寄存器的第n位 

  20.  * 寄存器的偏移地址 :CRL  CRH  IDR  ODR  BSRR  BRR  LCKR 

  21.  *                    00H  04H  08H  0CH  10H   14H  18H  

  22.  =============================================================================*/  

  23.   

  24.   

  25. /* Includes ------------------------------------------------------------------*/  

  26. #include "stm32f10x_lib.h"    //包含了所有的头文件 它是唯一一个用户需要包括在自己应用中的文件,起到应用和库之间界面的作用。  

  27. #include "stm32f10x_map.h"  

  28.   

  29.   

  30. /******************************快速位绑定**********************************************************/  

  31. /*----------------1、宏定义要操作的寄存器地址---------------------------------------------*/  

  32.  #define GPIOA_ODR (GPIOA_BASE + 0X0C)  

  33.  #define GPIOA_IDR (GPIOA_BASE + 0X08)  

  34.   

  35.  #define GPIOB_ODR (GPIOB_BASE + 0X0C)  

  36.  #define GPIOB_IDR (GPIOB_BASE + 0X08)  

  37.   

  38.  #define GPIOC_ODR (GPIOC_BASE + 0X0C)  

  39.  #define GPIOC_IDR (GPIOC_BASE + 0X08)  

  40.   

  41.  #define GPIOD_ODR (GPIOD_BASE + 0X0C)  

  42.  #define GPIOD_IDR (GPIOD_BASE + 0X08)  

  43.   

  44.  #define GPIOE_ODR (GPIOE_BASE + 0X0C)  

  45.  #define GPIOE_IDR (GPIOE_BASE + 0X08)  

  46.   

  47. /*----------------2、获取端口GPIOx(A-E)的对应寄存器的某一操作位的位地址-------------------*/  

  48. // #define BitBand(Addr , BitNum) *( (volatile unsigned long *)(Addr & 0xf0000000) + 0x2000000 + ((Addr&0xfffff)*32) + (BitNum*4) )   

  49. // 因为 左移、右移 语句的执行速度比乘除法语句的运动速度快,所以将上述语句改成如下方式  

  50.  #define BitBand(Addr , BitNum) *( (volatile unsigned long *)( (Addr & 0xf0000000) + 0x2000000 + ((Addr&0xfffff)<<5) + (BitNum<<2) ) )   

  51.     

  52. /*----------------3、宏定义函数,对固定的位绑定 进行功能封装------------------------------*/  

  53.  #define PAout(n) BitBand(GPIOA_ODR , n)   

  54.  #define PAin(n) BitBand(GPIOA_IDR , n)  

  55.   

  56.  #define PBout(n) BitBand(GPIOB_ODR , n)   

  57.  #define PBin(n) BitBand(GPIOB_IDR , n)  

  58.   

  59.  #define PCout(n) BitBand(GPIOC_ODR , n)   

  60.  #define PCin(n) BitBand(GPIOC_IDR , n)  

  61.   

  62.  #define PDout(n) BitBand(GPIOD_ODR , n)   

  63.  #define PDin(n) BitBand(GPIOD_IDR , n)  

  64.   

  65.  #define PEout(n) BitBand(GPIOE_ODR , n)   

  66.  #define PEin(n) BitBand(GPIOE_IDR , n)  

  67.   

  68.   

  69. /*----------------函数声明部分---------------*/  

  70. void delay1ms(int t) ;  

  71.   

  72.   

  73. /* Private functions -----------------------------------------------------------------------------*/   

  74. /************************************************************************************************** 

  75. * Function Name  : main 

  76. * Description    : 从GPIOA.8-.16输入一个电平信号,GPIOA.0-.7口分别将对应引脚输入的电平信号输出 

  77. * Input          : None 

  78. * Output         : None 

  79. * Return         : None 

  80. ****************************************************************************************************/  

  81. int main(void)  

  82. {  

  83.     u8 i , data ;  

  84.   

  85.     /*--------控制STM32引脚GPIOA.0 GPIOA.1 GPIOB.0推挽输出高电平--------*/  

  86.     //1、设置GPIOA.0--A&B  GPIOA.1--CLOCK  GPIOB.0--CLEAR  

  87.         //GPIOA.0 GPIOA.1 GPIOB.0推挽输出,速度50MHZ   

  88.         GPIOA->CRL = 0x33 ; // CNF0 = 00 MODE0 = 11  

  89.         GPIOB->CRL = 0x03 ; // CNF0 = 00 MODE0 = 11  

  90.         //GPIOA->CRH = 0x44444444 ; // CNF0 = 01 MODE0 = 00  

  91.   

  92.     //2、与164进行通信,QA--QH : 01100101 ,PA0串行输出,PA1上升沿有效,PB0=0清零 =1传数据  

  93.         data = 0x65 ;  

  94.         //初次使用164,先对其进行清零 CLOCK = 0 然后 CLOCK = 1 , PA1 ——> CLOCK 先置为低电平,为缠上上升沿做准备  

  95.         PBout(0) = 0 ;    

  96.         PAout(1) = 0 ;  

  97.         PBout(0) = 1 ;  

  98.         //向164串行传送8位数据  

  99.         for(i = 0 ; i < 8 ; i++)  

  100.         {  

  101.             PAout(1) = 0 ;  

  102.             delay1ms(1) ; //CLOCK的低电平维持1ms  

  103.             if((data&0x01) == 0x01)  

  104.             {  

  105.                 PAout(0) = 1 ;   

  106.             }  

  107.             else  

  108.             {  

  109.                 PAout(0) = 0 ;   

  110.             }         

  111.             PAout(1) = 1 ;  

  112.             delay1ms(1) ;//CLOCK的高电平维持1ms  

  113.   

  114.             data = data >> 1 ;  

  115.         }  

  116.   

  117. //      while(1)  

  118. //      {  

  119. //          ;     

  120. //      }  

  121. //  

  122. //      return 1 ;  

  123. }  

  124.   

  125.   

  126. void delay1ms(int t)  

  127. {  

  128.     //机器周期T = 1/(72000000/12)s = 1/6000000 s = 1/6 us  

  129.     int temp = 6000/4 ;  

  130.     while(t--)  

  131.     {  

  132.         while(temp--)  

  133.         { ; }     

  134.     }  

  135.   

  136. }  



6、软件仿真结果如下:




    关键字:串行通信  软件仿真  STM32  74LS164 引用地址:串行通信 软件仿真STM32与74LS164通信

    上一篇:STM32 串行通信 USART 程序例举
    下一篇:STM32F10x GPIO配置 之 位绑定

    推荐阅读最新更新时间:2024-03-16 15:37

    STM32 HAL HSE_VALUE
    stm32f4xx.h默认25M外部晶振(HSE): 而我们正常情况是接8M晶振,所以要做修改,否则将会出现串口乱码等奇怪问题 #if !defined (HSE_VALUE) // #define HSE_VALUE (25000000U) /*! Value of the External oscillator in Hz */ #define HSE_VALUE (8000000U) /*! Value of the External oscillator in Hz */ #endif /* HSE_VALUE */
    [单片机]
    stm32的SPI设置步骤,SPI配置参数
    用stm32的库进行深入 SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。 四根线 MISO 主设备数据输入,从设备数据输出。 MOSI 主设备数据输出,从设备数据输入。 SCLK时钟信号,由主设备产生。 CS从设备片选信号,由主设备控制。 外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节 时钟极性CPOL对传输协议没有重大的影响,代表串行同步时钟的空闲状态下的电平。 时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串
    [单片机]
    基于STM32的CMMB智能网络监测系统的设计与实现
    中国移动多媒体广播(CMMB)是我国自主研发的、具有完全自主知识产权的移动多媒体广播标准。目前,全国各大城市的CMMB网络正在建设和完善当中,而CMMB信号的覆盖测试为网络优化和调整提供了重要的数据依据。数字电视广播网络的建设是一个长期复杂的过程,需要经过不断地调整和优化才能达到一个理想的效果。而只有有效、精确的网络覆盖测试才能为调整、优化提供可靠的依据。一个成熟稳定的CMMB网络覆盖测试系统,对于CMMB的发展具有重大意义。因此,有必要设计一款针对CMMB网络的覆盖测试系统。 本设计基于高性能单片机STM32和GPRS无线通信方案实现了对测试点CMMB网络覆盖情况的实时监测,并利用GPS接收器将测试终端的地理位子信息上传到服
    [单片机]
    基于<font color='red'>STM32</font>的CMMB智能网络监测系统的设计与实现
    ST推出STM32无线微控制器模块,提升物联网产品开发效率
    半导体供应商意法半导体推出一个新的加快物联网产品上市的解决方案,该方案可利用现成的微型STM32无线微控制器(MCU)模块加快基于Bluetooth® LE和802.15.4新物联网设备的开发周期。 这个7mm x 11.3mm的 STM32WB5MMG模块让缺少无线设计能力的产品研发团队也能开发物联网产品。为开发层数最少的低成本PCB电路板而设计,新模块集成了直到天线的整个射频子系统。用户还可以免费使用意法半导体的STM32Cube MCU开发生态系统工具、设计向导、射频协议栈和完整软件库,快速高效地完成开发项目。 意法半导体部门副总裁兼微控制器产品总经理Ricardo de Sa Earp表示:“我们的首个基于S
    [单片机]
    ST推出<font color='red'>STM32</font>无线微控制器模块,提升物联网产品开发效率
    stm32中断解剖(非外部中断)
    如果只使用TIME2全局中断,则不需要void EXTI_Config(void)//外部中断配置。只要void NVIC_Configuration(void)//嵌套中断配置和stm32f10x_it.c库文件中的void TIM2_IRQHandler(void)。具体如下配置。注意此处与外部中断的配置的区别切勿混淆。 疑问? 1.为什么不需要配置RCC_APB2Periph_AFIO 2 查看固件库手册 发现NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //选择外部中断3号线 与 NVIC_InitStructure.NVIC_IRQChannel = TIM2
    [单片机]
    <font color='red'>stm32</font>中断解剖(非外部中断)
    基于stm32的异步电机反嵌绕组检测方法
      1.引言   电机是在工业生产过程中普遍使用的装置,电机的故障往往会带来严重的后果与损失。定子绕组是三相异步电动机的主要组成部分,也是电动机最容易损坏而造成故障的部件。异步电机在生产过程中,由于生产工人的失误,有可能发生定子绕组反嵌的现象,发生电动机启动困难,三相电流严重失衡且电流急剧上升,接反元件的那一组绕组中的电流更大,电动机发生异常响声并剧烈振。如果不及时断电停机,电动转速下降,机定子绕组很快会被烧毁。为避免造成更大的损失,需要及时检出。   现有的检测方法在实际应用中,往往在生产应用中需要拆除电机,或者等到电机产生故障时才能够发现绕组错误。检测方法主要是在电机出现故障后,将电机定子取出,接入直流电源后,使用磁针
    [电源管理]
    基于<font color='red'>stm32</font>的异步电机反嵌绕组检测方法
    STM32 之 LED
    自己的USER文件组下有3个c文件,以后会按照这个程序结构写程序。 代码参考于 OPELC思蛻蒙 http://bbs.opelc.org/viewthread.php?tid=6441&extra=page%3D1 (1)Main.c 主函数 (2)Init_External_Device.c 外设初始化函数 (3)includes.h 自己的c文件用的包含头文件 下面是源码: (1)Main C语言: Codee#14359 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 实验平台 : ST
    [单片机]
    <font color='red'>STM32</font> 之 LED
    如何在STM32中收发float数据?
    实际应用中,我们可能需要两个设备通过串口传输浮点数据: 本篇笔记为了方便演示,使用串口助手模拟其中一个设备,本篇笔记内容如下: 我们创建一个用于管理float类型数据的共用体: union float_data { float f_data; uint8_t by te [4]; }; 数据的流向如: 本次使用串口助手模拟发送设备,省略了第一步,主要看第②、③步。 创建两个共用体变量,用于发送与接收: union float_data rx_float_data, tx_float_data; 收发相关代码: // 公众号: 嵌入式 大杂烩 if(HAL_ UART _Receive(&huart3, rx_float
    [单片机]
    如何在<font color='red'>STM32</font>中收发float数据?
    小广播
    添点儿料...
    无论热点新闻、行业分析、技术干货……
    设计资源 培训 开发板 精华推荐

    最新单片机文章
    何立民专栏 单片机及嵌入式宝典

    北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved