2787|1

530

帖子

4

TA的资源

一粒金砂(高级)

楼主
 

【STM32F7英雄联盟大赛】多功能测试仪器-信号发生器部分的软件代码编写以及初步调试 [复制链接]

本帖最后由 传媒学子 于 2015-12-21 13:39 编辑

前言:今天来讲解一下这部分的软件代码测试和初步调试目的:利用初步的数据手册,进行代码编写和初步PCB调试,关于调试部分统一放在第五贴中;
代码编写参考材料:dds芯片手册;
注意事项在充分理解数据手册的基础上,进行PCB设计和严格参照数据手册进行代码编写;


废话不多说,直接上代码。
1.原始驱动代码:

  1. #include "driverlib.h"
  2. #define SET_FSYNC()        GPIO_setOutputHighOnPin(GPIO_PORT_P6,GPIO_PIN0)        //P6.0->FSYNC
  3. #define        CLR_FSYNC()        GPIO_setOutputLowOnPin(GPIO_PORT_P6,GPIO_PIN0)
  4. #define SET_SDO()        GPIO_setOutputHighOnPin(GPIO_PORT_P6,GPIO_PIN1)        //P6.1->SDATA
  5. #define CLR_SDO()        GPIO_setOutputLowOnPin(GPIO_PORT_P6,GPIO_PIN1)        

  6. #define SET_SCL()        GPIO_setOutputHighOnPin(GPIO_PORT_P6,GPIO_PIN2)        //P6.2->SCLK
  7. #define CLR_SCL()        GPIO_setOutputLowOnPin(GPIO_PORT_P6,GPIO_PIN2)        

  8. //Write AD9834 by 16 bit
  9. //data is written at the clock's falling edge
  10. void WriteToAD9834Word(unsigned short Buf)
  11. {

  12.        unsigned        short        ValueToWrite = 0;
  13.        //unsigned        char        i = 0;
  14.        unsigned char        j = 0;
  15.         
  16.         SET_SCL();
  17.         CLR_FSYNC();                        //FSYNC become low, indicate the beginning of the write

  18.         ValueToWrite =        Buf;

  19.         for (j=0; j<16; j++)
  20.         {
  21.                 SET_SCL();
  22.                 if(0x8000 == (ValueToWrite & 0x8000))
  23.                 {
  24.                         SET_SDO();            //Wirte 1
  25.                 }
  26.                 else
  27.                 {
  28.                         CLR_SDO();            //Write 0
  29.                 }
  30.                 CLR_SCL();                                                                 
  31.                
  32.                 ValueToWrite <<= 1;        //Rotate data
  33.         }

  34.         SET_FSYNC();                          //FSYNC become high, indicate the end of the write

  35. }




  36. void main(void)
  37. {
  38.         //Stop WDT
  39.         WDT_A_hold(WDT_A_BASE);

  40.         //PA.x output
  41.         GPIO_setAsOutputPin(
  42.                 GPIO_PORT_P6,
  43.                 GPIO_PIN0 + GPIO_PIN1 + GPIO_PIN2
  44.                 );

  45.                 SET_SCL();
  46.         SET_FSYNC();

  47. //Write Sequence refer to Figure31,32 and Table 11 in the AD9834's datasheet
  48. //RESET: RESET=1,PIN/SW=0        
  49.         WriteToAD9834Word(0X0100);//写控制寄存器,复位器件
  50. //Write a full 28-Bit Word to Frequency Register: B28=1, RESET=1
  51.         WriteToAD9834Word(0X2100);//写控制寄存器,复位器件,同时将B28=1可将一个完整字通过两次连续写入载入频率寄存器
  52. /************************************************************************************************************/
  53. //DB15  DB14  DB13  DB12  DB11  DB10    DB9    DB8     DB7    DB6       DB5      DB4      DB3  DB2   DB1   DB0
  54. //0      0    B28    HLB  FSEL  PSEL  PIN/SW  RESET  SLEEP1  SLEEP12  OPBITEN  SIGN/PIB  DIV2   0    MODE   0
  55. /************************************************************************************************************/
  56. //                                                                       1          1       1           0
  57. //Frequency0//PSEL=0, PIN/SW=0
  58.         
  59.         WriteToAD9834Word(0X599A);//0101 1001 1001 1010 //750KHz Output, 75MHz MCLK  14LSB
  60.         WriteToAD9834Word(0X4666);//0100 0110 0110 0110           //14MSB                                
  61. //Frequency1        
  62.         WriteToAD9834Word(0XB5C3);//WriteToAD9834Word(0XB5C3);        1011        //100kHz Output, 10MHz MCLK
  63.         WriteToAD9834Word(0X80A3);;//WriteToAD9834Word(0X80A3);
  64. //Phase0 and Phase1
  65.         WriteToAD9834Word(0XC000);
  66.         WriteToAD9834Word(0XE000);        
  67. //Select the Frequency Source and CLEAR RESET: RESET BIT=0, FSEL=0,PSEL=0
  68.         //WriteToAD9834Word(0X0000);
  69. //Select the Frequency Source and CLEAR RESET: RESET BIT=0, FSEL=1,PSEL=1        
  70.         // WriteToAD9834Word(0X0C00); //正弦波
  71.         //WriteToAD9834Word(0X0C02); //三角波
  72.        WriteToAD9834Word(0X0C38);
  73.         //while(1);
  74.         
  75.         //Enter LPM4 w/interrupts enabled
  76.         __bis_SR_register(LPM4_bits + GIE);

  77.         //For debugger
  78.         __no_operation();
  79. }
复制代码
2.stm32代码:
头文件
  1. #ifndef _FACTION_H_
  2. #define _FACTION_H_
  3. #include "stm32f7xx_hal.h"
  4. //函数发生器

  5. #define SDATA(x)   (GPIOB->ODR = ((GPIOB->ODR>>15)&0X01)? GPIOB->ODR&GPIOB->ODR&~(1<<15):GPIOB->ODR|(x<<15))//PB15
  6. #define SCLK(x)    (GPIOI->ODR = ((GPIOI->ODR>>1)&0X01) ? GPIOI->ODR&GPIOI->ODR&~(1<<1):GPIOI->ODR|(x<<1))//PI1
  7. #define FSELECT(x) (GPIOI->ODR = ((GPIOI->ODR>>0)&0X01) ? GPIOI->ODR&GPIOI->ODR&~(1<<0):GPIOI->ODR|(x<<0))//PI0
  8. #define PSELECT(x) (GPIOA->ODR = ((GPIOA->ODR>>15)&0X01) ? GPIOA->ODR&GPIOA->ODR&~(1<<15):GPIOA->ODR|(x<<15))//PA15
  9. #define FSYNC(x)   (GPIOI->ODR = ((GPIOI->ODR>>2)&0X01) ? GPIOI->ODR&GPIOI->ODR&~(1<<2):GPIOI->ODR|(x<<2))//PI2
  10. #define RESET(x)   (GPIOA->ODR = ((GPIOA->ODR>>0)&0X01) ? GPIOA->ODR&GPIOA->ODR&~(1<<0):GPIOA->ODR|(x<<0))//PA0
  11. #define SJ  0X0C02//三角波
  12. #define Sin 0X0C00//正弦波
  13. void Faction_Test(unsigned short datas);

  14. #endif
复制代码
主函数
  1. #include "faction.h"

  2. void functionGenerator_GPIO_Init(void)
  3. {
  4.    //FSELECT-PI0,PSELECT-PA15,SI,SCK共用了,FSYNC-PI2,RESET-PA0
  5.          RCC->AHB1ENR   |= 1<<8;//GPIOI
  6.          GPIOI->MODER   &= 0XFFFFFFCC;
  7.          GPIOI->MODER   |= 0X00000011;//通用推完输出
  8.          GPIOI->OSPEEDR &= 0XFFFFFFCC;
  9.          GPIOI->OSPEEDR |= 0X00000000;//GPIO高速输出
  10.          GPIOI->PUPDR   &= 0XFFFFFFCC; //GPIO无上下拉
  11.          
  12.          RCC->AHB1ENR   |= 1<<0;//GPIOA
  13.          GPIOB->MODER   &= 0X3FFFFFFC;
  14.          GPIOB->MODER   |= 0X40000001;//通用推完输出
  15.          GPIOB->OSPEEDR &= 0X3FFFFFFC;
  16.          GPIOB->OSPEEDR |= 0XC0000000;//GPIO高速输出
  17.          GPIOB->PUPDR   &= 0X3FFFFFFC; //GPIO无上下拉          
  18. }

  19. //Write AD9834 by 16 bit
  20. //data is written at the clock's falling edge
  21. void WriteToAD9834Word(unsigned short Buf)
  22. {

  23.   unsigned        short        ValueToWrite = 0;
  24.   //unsigned        char        i = 0;
  25.   unsigned char        j = 0;
  26.        
  27.         SCLK(1);
  28.   FSYNC(0);        //FSYNC become low, indicate the beginning of the write

  29.         ValueToWrite =        Buf;

  30.         for (j=0; j<16; j++)
  31.         {
  32.                 SCLK(1);
  33.                 if(0x8000 == (ValueToWrite & 0x8000))
  34.                 {
  35.                         SDATA(1);            //Wirte 1
  36.                 }
  37.                 else
  38.                 {
  39.                         SDATA(0);            //Write 0
  40.                 }
  41.                 SCLK(0);                                                                 
  42.                 ValueToWrite <<= 1;        //Rotate data
  43.         }

  44.         FSYNC(1);                                  //FSYNC become high, indicate the end of the write
  45. }

  46. void Faction_Test(unsigned short datas)
  47. {
  48.         functionGenerator_GPIO_Init();
  49.         SCLK(1);
  50.   FSYNC(1);
  51. //Write Sequence refer to Figure31,32 and Table 11 in the AD9834's datasheet
  52. //RESET: RESET=1,PIN/SW=0       
  53.         WriteToAD9834Word(0X0100);//写控制寄存器,复位器件
  54. //Write a full 28-Bit Word to Frequency Register: B28=1, RESET=1
  55.         WriteToAD9834Word(0X2100);//写控制寄存器,复位器件,同时将B28=1可将一个完整字通过两次连续写入载入频率寄存器
  56. /************************************************************************************************************/
  57. //DB15  DB14  DB13  DB12  DB11  DB10    DB9    DB8     DB7    DB6       DB5      DB4      DB3  DB2   DB1   DB0
  58. //0      0    B28    HLB  FSEL  PSEL  PIN/SW  RESET  SLEEP1  SLEEP12  OPBITEN  SIGN/PIB  DIV2   0    MODE   0
  59. /************************************************************************************************************/
  60. //                                                                       1          1       1           0
  61. //Frequency0//PSEL=0, PIN/SW=0
  62.         
  63.         WriteToAD9834Word(0X599A);//0101 1001 1001 1010 //750KHz Output, 75MHz MCLK  14LSB
  64.         WriteToAD9834Word(0X4666);//0100 0110 0110 0110           //14MSB                               
  65. //Frequency1       
  66.         WriteToAD9834Word(0XB5C3);//WriteToAD9834Word(0XB5C3);        1011        //100kHz Output, 10MHz MCLK
  67.   WriteToAD9834Word(0X80A3);;//WriteToAD9834Word(0X80A3);
  68. //Phase0 and Phase1
  69.         WriteToAD9834Word(0XC000);
  70.         WriteToAD9834Word(0XE000);       
  71. //Select the Frequency Source and CLEAR RESET: RESET BIT=0, FSEL=0,PSEL=0
  72. //WriteToAD9834Word(0X0000);
  73. //Select the Frequency Source and CLEAR RESET: RESET BIT=0, FSEL=1,PSEL=1       
  74. //WriteToAD9834Word(0X0C00); //正弦波
  75. //WriteToAD9834Word(0X0C02); //三角波
  76. //WriteToAD9834Word(0X0C38);
  77.   WriteToAD9834Word(datas);
  78.          //while(1);
  79.         
  80.    //Enter LPM4 w/interrupts enabled
  81.    //__bis_SR_register(LPM4_bits + GIE);

  82.    //For debugger
  83.    //__no_operation();
  84. }
复制代码


查看本帖全部内容,请登录或者注册
此帖出自stm32/stm8论坛
点赞 关注
 

回复
举报

530

帖子

4

TA的资源

一粒金砂(高级)

沙发
 
V 自己留个脚印
此帖出自stm32/stm8论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
福禄克有奖直播:高精度测温赋能电子制造 报名中!
直播时间:2025年2月28日(周五)上午10:00
直播主题:高精度测温赋能电子制造
小伙伴们儿快来报名直播吧~好礼等你拿!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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