找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3338|回复: 4
打印 上一主题 下一主题
收起左侧

WK2124 STM32完整例程下载

[复制链接]
跳转到指定楼层
楼主
ID:607777 发表于 2019-9-5 15:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题分享,转载内容

单片机源程序如下:
  1. #include "wk2xxx.h"
  2. #include "spi.h"
  3. #include "usart.h"
  4. #include "delay.h"

  5. void WK2XXX_RST_Init(void)
  6. {
  7. GPIO_InitTypeDef  GPIO_InitStructure;
  8. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //使能PA,PD端口时钟
  9. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                                 //PA.4 端口配置
  10. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  11. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  12. GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOA.4
  13. GPIO_SetBits(GPIOA,GPIO_Pin_3);                                                 //PA.4 输出高        
  14. }
  15. void WK2XXX_Reset_Init(void)
  16. {
  17. GPIO_SetBits(GPIOA,GPIO_Pin_3);//1
  18. GPIO_ResetBits(GPIOA,GPIO_Pin_3);//0
  19. delay_ms(10);
  20. GPIO_SetBits(GPIOA,GPIO_Pin_3);//1        
  21. delay_ms(100);
  22.         
  23. }
  24. /*************************************************************************/
  25. //函数功能:初始化SPI片选信号CS,并把CS的默认状态设置为高电平
  26. //
  27. //
  28. /*************************************************************************/
  29. void SPI_CS_Init(void)
  30. {
  31. GPIO_InitTypeDef  GPIO_InitStructure;
  32. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //使能PA,PD端口时钟
  33. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3;        //PA.4 端口配置
  34. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  35. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  36. GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOA.4
  37. GPIO_SetBits(GPIOA,GPIO_Pin_4);                                                 //PA.4 输出高        
  38. }
  39. /*************************************************************************/
  40. //函数功能:初始化SPI总线,设置SPI总线为0模式
  41. /*************************************************************************/
  42. void SPI_BUS_Init(void)
  43. {

  44.         SPI1_Init();                   //初始化SPI
  45.         SPI1_SetSpeed(SPI_BaudRatePrescaler_8);        //设置为10M时钟,高速模式
  46. }
  47. /*************************************************************************/
  48. //函数功能:设置CS信号为高电平
  49. /*************************************************************************/
  50. void SPI_CS_H(void)
  51. {
  52.         GPIO_SetBits(GPIOA,GPIO_Pin_4);
  53. }
  54. /*************************************************************************/
  55. //函数功能:设置CS信号为低电平
  56. /*************************************************************************/
  57. void SPI_CS_L(void)
  58. {
  59.         GPIO_ResetBits(GPIOA,GPIO_Pin_4);
  60. }
  61. /*************************************************************************/
  62. //函数功能:初始化SPI接口
  63. /*************************************************************************/
  64. void WK2XXX_SPI_Init(void)
  65. {
  66.         SPI_CS_Init();
  67.         SPI_BUS_Init();
  68.         
  69.         
  70. }

  71. /*************************************************************************/
  72. //函数功能:写寄存器函数(前提是该寄存器可写,某些寄存器如果你写1,可能会自动置1,具体见数据手册)
  73. //参数:port:为子串口的数(C0C1)
  74. //      reg:为寄存器的地址(A3A2A1A0)
  75. //      dat:为写入寄存器的数据
  76. //注意:在子串口被打通的情况下,向FDAT写入的数据会通过TX引脚输出
  77. //*************************************************************************/
  78. void Wk2xxxWriteReg(unsigned char port,unsigned char reg,unsigned char dat)
  79. {         
  80.          SPI_CS_L();//片选使能
  81.          SPI1_ReadWriteByte(((port-1)<<4)+reg); //写控制字节
  82.          SPI1_ReadWriteByte(dat); //写数据
  83.          SPI_CS_H();//片选无效
  84. }


  85. /*************************************************************************/
  86. //函数功能:读寄存器函数
  87. //参数:port:为子串口的数(C0C1)
  88. //      reg:为寄存器的地址(A3A2A1A0)
  89. //      rec_data:为读取到的寄存器值
  90. //注意:在子串口被打通的情况下,读FDAT,实际上就是读取uart的rx接收的数据
  91. /*************************************************************************/
  92. unsigned char Wk2xxxReadReg(unsigned char port,unsigned char reg)
  93. {        
  94.         unsigned char rec_data;
  95.         SPI_CS_L();        //片选使能
  96.         SPI1_ReadWriteByte(0x40+((port-1)<<4)+reg);//写控制字节,控制命令构成见数据手册
  97.         rec_data=SPI1_ReadWriteByte(0);//接收返回的数据
  98.         SPI_CS_H();        //片选无效        
  99.         return rec_data;
  100. }
  101. /**************************** Wk2xxxWriteFifo*********************************************/
  102. //函数功能:该函数为写FIFO函数,通过该函数写入的数据会直接进入子串口的发送FIFO,然后通过TX引脚发送
  103. //参数:port:为子串口的端口号(C0\C1)
  104. //      *wbuf:写入数据部分
  105. //      len:  写入数据长度
  106. //
  107. /*************************************************************************/
  108. void Wk2xxxWriteFifo(unsigned char port,unsigned char *wbuf,unsigned int len)
  109. {         unsigned char n;
  110.          SPI_CS_L(); // 片选有效
  111.          SPI1_ReadWriteByte(0x80+((port-1)<<4)); //写FIFO控制指令
  112.           for(n=0;n<len;n++)
  113.             {
  114.              SPI1_ReadWriteByte(*(wbuf+n));
  115.                 }
  116.          SPI_CS_H();        //片选无效

  117. }

  118. /**************************** Wk2xxxReadFifo*********************************************/
  119. //函数功能:该函数为读FIFO函数,通过该函数可以一次读出多个接收FIFO中的数据,最多256个字节
  120. //参数:port:为子串口的端口号(C0\C1)
  121. //      *rbuf:写入数据部分
  122. //      len:  写入数据长度
  123. //
  124. /*************************************************************************/
  125. void Wk2xxxReadFifo(unsigned char port,unsigned char *rbuf,unsigned int len)
  126. {         unsigned char n;
  127.          SPI_CS_L();//片选有效
  128.          SPI1_ReadWriteByte(0xc0+((port-1)<<4));        //写读fifo控制指令
  129.          for(n=0;n<len;n++)
  130.            {
  131.                 *(rbuf+n)=SPI1_ReadWriteByte(0);
  132.            }
  133.          SPI_CS_H();//片选无效                                                                                
  134.          //return 0;
  135. }

  136. /*************************************************************************/
  137. //函数功能:此函数主要是通过读写wk2xxx的寄存器来判断主接口的通信时序是否有问题
  138. //参数:无
  139. //返回值:rv表示返回值,0成功  
  140. /*************************************************************************/
  141. unsigned char Wk2xxxTest(void)
  142. {
  143.         unsigned char rec_data,rv;
  144. //主接口为SPI        
  145.         rec_data=Wk2xxxReadReg(WK2XXX_GPORT,WK2XXX_GENA);
  146.         if(rec_data==0x30)
  147.                 return rv;
  148.         else
  149.                 {
  150.                         rv=1;
  151.                         return rv;
  152.                 }

  153. }
  154. /******************************Wk2xxxInit*******************************************/
  155. //函数功能:本函数主要会初始化一些芯片基本寄存器;
  156. /*********************************************************************************/
  157. void Wk2xxxInit(unsigned char port)
  158. {
  159.     unsigned char gena,grst,gier,sier,scr;
  160.         //使能子串口时钟
  161.     gena=Wk2xxxReadReg(WK2XXX_GPORT,WK2XXX_GENA);
  162.         switch (port)
  163.     {
  164.           case 1://使能子串口1的时钟
  165.               gena|=WK2XXX_UT1EN;
  166.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
  167.               break;
  168.                   case 2://使能子串口2的时钟
  169.               gena|=WK2XXX_UT2EN;
  170.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
  171.               break;
  172.                    case 3://使能子串口3的时钟
  173.               gena|=WK2XXX_UT3EN;
  174.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
  175.               break;
  176.                    case 4://使能子串口4的时钟
  177.               gena|=WK2XXX_UT4EN;
  178.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
  179.               break;
  180.          }        
  181.         //软件复位子串口
  182.         grst=Wk2xxxReadReg(WK2XXX_GPORT,WK2XXX_GRST);
  183.         switch (port)
  184.     {
  185.           case 1://软件复位子串口1
  186.               grst|=WK2XXX_UT1RST;
  187.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
  188.               break;
  189.                   case 2://软件复位子串口2
  190.               grst|=WK2XXX_UT2RST;
  191.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
  192.               break;
  193.                    case 3://软件复位子串口3
  194.               grst|=WK2XXX_UT3RST;
  195.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
  196.               break;
  197.                    case 4://软件复位子串口4
  198.              grst|=WK2XXX_UT4RST;
  199.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
  200.               break;
  201.          }        
  202.   //使能子串口中断,包括子串口总中断和子串口内部的接收中断,和设置中断触点
  203.         gier=Wk2xxxReadReg(WK2XXX_GPORT,WK2XXX_GIER);
  204.         switch (port)
  205.     {
  206.           case 1://子串口1中断使能
  207.               gier|=WK2XXX_UT1IE;
  208.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GIER,gier);
  209.               break;
  210.                   case 2://子串口2中断使能
  211.               gier|=WK2XXX_UT2IE;
  212.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GIER,gier);
  213.               break;
  214.                    case 3://子串口3中断使能
  215.               gier|=WK2XXX_UT3IE;
  216.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GIER,gier);
  217.               break;
  218.                    case 4://子串口4中断使能
  219.               gier|=WK2XXX_UT4IE;
  220.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GIER,gier);
  221.               break;
  222.          }         
  223.          //使能子串口接收触点中断和超时中断
  224.          sier=Wk2xxxReadReg(port,WK2XXX_SIER);
  225. //         sier |= WK2XXX_RFTRIG_IEN|WK2XXX_RXOUT_IEN;
  226.          sier |= WK2XXX_RFTRIG_IEN;
  227.          Wk2xxxWriteReg(port,WK2XXX_SIER,sier);
  228.          // 初始化FIFO和设置固定中断触点
  229.          Wk2xxxWriteReg(port,WK2XXX_FCR,0XFF);
  230.          //设置任意中断触点,如果下面的设置有效,那么上面FCR寄存器中断的固定中断触点将失效
  231.          Wk2xxxWriteReg(port,WK2XXX_SPAGE,1);//切换到page1
  232.          Wk2xxxWriteReg(port,WK2XXX_RFTL,0X08);//设置接收触点8个字节
  233.          Wk2xxxWriteReg(port,WK2XXX_TFTL,0X10);//设置发送触点为16个字节
  234.          Wk2xxxWriteReg(port,WK2XXX_SPAGE,0);//切换到page0
  235.          //使能子串口的发送和接收使能
  236.          scr=Wk2xxxReadReg(port,WK2XXX_SCR);
  237.          scr|=WK2XXX_TXEN|WK2XXX_RXEN;
  238.          Wk2xxxWriteReg(port,WK2XXX_SCR,scr);
  239. }

  240. /******************************Wk2xxxClose*******************************************/
  241. //函数功能:本函数会关闭当前子串口,和复位初始值;
  242. /*********************************************************************************/

  243. void Wk2xxxClose(unsigned char port)
  244. {
  245.     unsigned char gena,grst;
  246.         //复位子串口
  247.         grst=Wk2xxxReadReg(WK2XXX_GPORT,WK2XXX_GRST);
  248.         switch (port)
  249.     {
  250.           case 1://软件复位子串口1
  251.               grst|=WK2XXX_UT1RST;
  252.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
  253.               break;
  254.                   case 2://软件复位子串口2
  255.               grst|=WK2XXX_UT2RST;
  256.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
  257.               break;
  258.                    case 3://软件复位子串口3
  259.               grst|=WK2XXX_UT3RST;
  260.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
  261.               break;
  262.                    case 4://软件复位子串口4
  263.               grst|=WK2XXX_UT4RST;
  264.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
  265.               break;
  266.          }        
  267.         //关闭子串口时钟
  268.     gena=Wk2xxxReadReg(WK2XXX_GPORT,WK2XXX_GENA);
  269.         switch (port)
  270.     {
  271.           case 1://使能子串口1的时钟
  272.               gena&=~WK2XXX_UT1EN;
  273.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
  274.               break;
  275.                   case 2://使能子串口2的时钟
  276.               gena&=~WK2XXX_UT2EN;
  277.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
  278.               break;
  279.                    case 3://使能子串口3的时钟
  280.               gena&=~WK2XXX_UT3EN;
  281.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
  282.               break;
  283.                    case 4://使能子串口4的时钟
  284.               gena&=~WK2XXX_UT4EN;
  285.                       Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
  286.               break;
  287.          }        
  288. }






  289. /**************************Wk2xxxSetBaud*******************************************************/
  290. //函数功能:设置子串口波特率函数、此函数中波特率的匹配值是根据11.0592Mhz下的外部晶振计算的
  291. // port:子串口号
  292. // baud:波特率大小.波特率表示方式,
  293. //
  294. /**************************Wk2xxxSetBaud*******************************************************/
  295. void Wk2xxxSetBaud(unsigned char port,int baud)
  296. {  
  297.         unsigned char baud1,baud0,pres,scr;
  298.         //如下波特率相应的寄存器值,是在外部时钟为11.0592的情况下计算所得,如果使用其他晶振,需要重新计算
  299.         switch (baud)
  300.         {
  301.       case 600:
  302.                         baud1=0x4;
  303.                         baud0=0x7f;
  304.                         pres=0;
  305.       break;
  306.       case 1200:
  307.                         baud1=0x2;
  308.                         baud0=0x3F;
  309.                         pres=0;
  310.                         break;
  311.       case 2400:
  312.                         baud1=0x1;
  313.                         baud0=0x1f;
  314.                         pres=0;
  315.                         break;
  316.       case 4800:
  317.                         baud1=0x00;
  318.                         baud0=0x8f;
  319.                         pres=0;
  320.                         break;
  321.       case 9600:
  322.                         baud1=0x00;
  323.                         baud0=0x47;
  324.                         pres=0;
  325.                         break;
  326.       case 19200:
  327.                         baud1=0x00;
  328.                         baud0=0x23;
  329.                         pres=0;
  330.                         break;
  331.       case 38400:
  332.                         baud1=0x00;
  333.                         baud0=0x11;
  334.                         pres=0;
  335.                         break;
  336.                         
  337.       case 76800:
  338.                         baud1=0x00;
  339.                         baud0=0x08;
  340.                         pres=0;
  341.                         break;
  342.       
  343.       case 1800:
  344.                         baud1=0x01;
  345.                         baud0=0x7f;
  346.                         pres=0;
  347.                         break;
  348.       case 3600:
  349.                         baud1=0x00;
  350.                         baud0=0xbf;
  351.                         pres=0;
  352.                         break;
  353.       case 7200:
  354.                         baud1=0x00;
  355.                         baud0=0x5f;
  356.                         pres=0;
  357.                         break;
  358.       case 14400:
  359.                         baud1=0x00;
  360.                         baud0=0x2f;
  361.                         pres=0;
  362.                         break;
  363.       case 28800:
  364.                         baud1=0x00;
  365.                         baud0=0x17;
  366.                         pres=0;
  367.                         break;
  368.       case 57600:
  369.                         baud1=0x00;
  370.                         baud0=0x0b;
  371.                         pres=0;
  372.       break;
  373.       case 115200:
  374.                         baud1=0x00;
  375.                         baud0=0x05;
  376.                         pres=0;
  377.                         break;
  378.       case 230400:
  379.                         baud1=0x00;
  380.                         baud0=0x02;
  381.                         pres=0;
  382.                         break;
  383.       default:
  384.                         baud1=0x00;
  385.                         baud0=0x00;
  386.                         pres=0;
  387.     }
  388.         //关掉子串口收发使能
  389.         scr=Wk2xxxReadReg(port,WK2XXX_SCR);
  390.         Wk2xxxWriteReg(port,WK2XXX_SCR,0);
  391.         //设置波特率相关寄存器
  392.         Wk2xxxWriteReg(port,WK2XXX_SPAGE,1);//切换到page1
  393.         Wk2xxxWriteReg(port,WK2XXX_BAUD1,baud1);
  394.         Wk2xxxWriteReg(port,WK2XXX_BAUD0,baud0);
  395.         Wk2xxxWriteReg(port,WK2XXX_PRES,pres);
  396.         Wk2xxxWriteReg(port,WK2XXX_SPAGE,0);//切换到page0
  397.         //使能子串口收发使能
  398.         Wk2xxxWriteReg(port,WK2XXX_SCR,scr);
  399.         
  400.         
  401. }
  402. /*****************************Wk2xxxSendBuf****************************************/
  403. //本函数为子串口发送数据的函数,发送数据到子串口的FIFO.然后通过再发送
  404. //参数说明:port:子串口端口号
  405. //          *sendbuf:需要发送的数据buf
  406. //          len:需要发送数据的长度
  407. // 函数返回值:实际成功发送的数据
  408. //说明:调用此函数只是把数据写入子串口的发送FIFO,然后再发送。1、首先确认子串口的发送FIFO有多少数据,根据具体情况、
  409. //确定写入FIFO数据的个数,
  410. /*********************************************************************/
  411. unsigned int Wk2xxxSendBuf(unsigned char port,unsigned char *sendbuf,unsigned int len)
  412. {
  413.          unsigned int ret,tfcnt,sendlen;
  414.          unsigned char  fsr;
  415.          
  416.          fsr=Wk2xxxReadReg(port,WK2XXX_FSR);
  417.          if(~fsr&WK2XXX_TFULL )//子串口发送FIFO未满
  418.          {

  419.              tfcnt=Wk2xxxReadReg(port,WK2XXX_TFCNT);//读子串口发送fifo中数据个数
  420.                  sendlen=256-tfcnt;//FIFO能写入的最多字节数
  421.                  
  422.                  if(sendlen<len)
  423.                  {
  424.                         ret=sendlen;
  425.                         Wk2xxxWriteFifo(port,sendbuf,sendlen);
  426.                  }
  427.                  else
  428.                  {
  429.                          Wk2xxxWriteFifo(port,sendbuf,len);
  430.                          ret=len;
  431.                  }
  432.           }
  433.          
  434.          return ret;
  435. }

  436. /*****************************Wk2xxxGetBuf****************************************/
  437. //本函数为子串口接收数据函数
  438. //参数说明:port:子串口端口号
  439. //          *getbuf:接收到的数据buf
  440. // 函数返回值:实际接收到的数据个数
  441. /*********************************************************************/
  442. unsigned int Wk2xxxGetBuf(unsigned char port,unsigned char *getbuf)
  443. {
  444.         unsigned int ret=0,rfcnt;
  445.         unsigned char fsr;
  446.         fsr=Wk2xxxReadReg(port,WK2XXX_FSR);
  447.         if(fsr&WK2XXX_RDAT )//子串口发送FIFO未满
  448.           {
  449.              rfcnt=Wk2xxxReadReg(port,WK2XXX_RFCNT);//读子串口发送fifo中数据个数
  450.                  if(rfcnt==0)//当RFCNT寄存器为0的时候,有两种情况,可能是256或者是0,这个时候通过FSR来判断,如果FSR显示接收FIFO不为空,就为256个字节
  451.                  {rfcnt=256;}
  452.                  Wk2xxxReadFifo(port,getbuf,rfcnt);
  453.                  ret=rfcnt;
  454.            }
  455.          return ret;        
  456. }

复制代码

  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "usart.h"
  4. #include "wk2xxx.h"
  5. #include "exti.h"

  6. EXTI_InitTypeDef EXTI_InitStructure;
  7. NVIC_InitTypeDef NVIC_InitStructure;
  8. void EXTI2_IRQHandler(void)
  9. {
  10.         unsigned int g=0;
  11.     static unsigned char dat1,dat2,dat3,dat4;
  12.         NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;//关闭外部中断,避免当前处理程序被其他中断打断
  13.         if(EXTI_GetFlagStatus(EXTI_Line2)!= RESET)
  14.         {
  15.    
  16.         g=Wk2xxxReadReg(1,WK2XXX_GIFR);//判断中断源
  17.         do
  18.         {
  19.                 if(g&WK2XXX_UT4INT) //判断子串口4
  20.                 {
  21.                         while((Wk2xxxReadReg(4,WK2XXX_FSR)&WK2XXX_RDAT))//判断接收fifo中是否有数据,直到把FIFO读空
  22.                         {
  23.                                 dat4 = Wk2xxxReadReg(4,WK2XXX_FDAT);
  24. //                                printf("dat4= 0x%x\r\n",dat4);
  25.                                 delay_ms(1);
  26.                                 Wk2xxxWriteReg(4,WK2XXX_FDAT,dat4);        
  27.                         }        
  28.                 }

  29.                 if(g&WK2XXX_UT3INT)  //判断子串口3
  30.                 {
  31.                         while((Wk2xxxReadReg(3,WK2XXX_FSR)&WK2XXX_RDAT))
  32.                         {
  33.                                 dat3 = Wk2xxxReadReg(3,WK2XXX_FDAT);
  34. //                                printf("dat3= 0x%x\r\n",dat3);
  35.                                 delay_ms(1);
  36.                                 Wk2xxxWriteReg(3,WK2XXX_FDAT,dat3);        
  37.                         }        
  38.                 }

  39.                 if(g&WK2XXX_UT2INT)//判断子串口2
  40.                 {
  41.                         while((Wk2xxxReadReg(2,WK2XXX_FSR)&WK2XXX_RDAT))
  42.                         {
  43.                                 dat2=Wk2xxxReadReg(2,WK2XXX_FDAT);
  44. //                                printf("dat2= 0x%x\r\n",dat2);
  45.                                 delay_ms(1);
  46.                                 Wk2xxxWriteReg(2,WK2XXX_FDAT,dat2);        
  47.                         }        
  48.                 }

  49.                 if(g&WK2XXX_UT1INT)//判断子串口1
  50.                 {
  51.                         while((Wk2xxxReadReg(1,WK2XXX_FSR)&WK2XXX_RDAT))
  52.                         {
  53.                                 dat1 = Wk2xxxReadReg(1,WK2XXX_FDAT);
  54. //                                printf("dat1= 0x%x\r\n",dat1);
  55.                                 delay_ms(1);//需要加适当的延时处理,不然stm32发送数据会出错               
  56.                                 Wk2xxxWriteReg(1,WK2XXX_FDAT,dat1);        
  57.                         }        
  58.                 }
  59.         }
  60.         while((0x0f&Wk2xxxReadReg(1,WK2XXX_GIFR))!=0);  //判断是否还有中断,没有中断再退出,有其他中断继续处理
  61.         EXTI_ClearITPendingBit(EXTI_Line2); //清除LINE2上的中断标志位  
  62.     Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GIER,0x00);
  63.         Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GIER,0x0F);//对于有些MCU是下降沿中断,这里做一个处理,先关闭中断,然后再打开制造一个下降沿
  64.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  65.   }
  66. }
  67. int main(void)
  68. {        
  69.         unsigned long baud;
  70.         delay_init();                     //延时函数初始化        
  71.         NVIC_Configuration();// 设置中断优先级分组
  72.         uart_init(115200);         //串口初始化为115200
  73.         EXTIX_Init();
  74.         /*STM32F103
  75.         CS   -------> PA4
  76.         SCK  -------> PA5
  77.         MOSI -------> PA7
  78.         MISO -------> PA6
  79.         RST  -------> PA3
  80.         IRQ  -------> PA2*/         

  81.         baud = B115200;

  82.         WK2XXX_RST_Init();
  83.         WK2XXX_SPI_Init();
  84.         WK2XXX_Reset_Init();
  85.         Wk2xxxInit(1);
  86.         Wk2xxxSetBaud(1,baud);
  87.         Wk2xxxInit(2);
  88.         Wk2xxxSetBaud(2,baud);
  89.         Wk2xxxInit(3);
  90.         Wk2xxxSetBaud(3,baud);
  91.         Wk2xxxInit(4);
  92.         Wk2xxxSetBaud(4,baud);
  93.         while(1)
  94.         {
  95.         }
  96. }
复制代码

所有资料51hei提供下载:
WK2124_irq(STM32).7z (308.1 KB, 下载次数: 67)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:807127 发表于 2020-7-24 14:05 | 只看该作者
请问这是stm32哪个系列的程序,stm32f407可以用这个吗
回复

使用道具 举报

板凳
ID:142699 发表于 2020-7-24 16:34 | 只看该作者
这应该是比较通用的代码了,很厉害
回复

使用道具 举报

地板
ID:472435 发表于 2021-1-11 16:38 | 只看该作者
void EXTI2_IRQHandler(void)函数的while((0x0f&Wk2xxxReadReg(1,WK2XXX_GIFR))!=0);
必须改为:while((0x0f&(g=Wk2xxxReadReg(1,WK2XXX_GIFR)))!=0);
否则会有BUG,个人实测!!!这个问题搞了我很长时间。我还以为底层SPI驱动有问题呢
回复

使用道具 举报

5#
ID:108573 发表于 2021-1-14 08:15 | 只看该作者
taolee520 发表于 2021-1-11 16:38
void EXTI2_IRQHandler(void)函数的while((0x0f&Wk2xxxReadReg(1,WK2XXX_GIFR))!=0);
必须改为:while((0x ...

它家的芯片提供的例程确实有问题,我记得当时有个bug困扰了好久
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表