SWD协议源码入门示例

SWD协议源码⼊门⽰例
通过IO模拟SWD协议,实现读写cortex M0+  的寄存器源码。
⾃⼰从0开始撸出来的,实测可⽤。
移植时,实现IO操作的⼏个宏就能⼯作了。
//============================================================================== //SWDIO = PA1
#define SWDIO_SetHigh()    ( M0P_GPIOA->BSRR = 1<<1 )
#define SWDIO_SetLow()      ( M0P_GPIOA->BRR = 1<<1 )
#define SWDIO_SetInput()    ( M0P_GPIOA->DIR_f.PIN1 = 1 )
#define SWDIO_SetOutput()  ( M0P_GPIOA->DIR_f.PIN1 = 0 )
#define SWDIO_GetValue()    ( M0P_GPIOA->IN & (1<<1) )
//SWCLK = PA2
#define SWCLK_SetHigh()    ( M0P_GPIOA->BSRR = 1<<2 )
#define SWCLK_SetLow()      ( M0P_GPIOA->BRR = 1<<2 )
#define SWCLK_SetOutput()  ( M0P_GPIOA->DIR_f.PIN2 = 0 )
//============================================================================== #define SwdDly()    __nop();__nop();
//==============================================================================
int main(void)
{
__IO uint8_t  tmp8;
__IO uint32_t tmp32;
M0P_SYSCTRL->PERICLKEN0 = 0xffffffff;
M0P_SYSCTRL->PERICLKEN1 = 0xffffffff;
M0P_GPIOA->ADS = 0x00;
Swd_Bus_Reset();
while( 1 )
{
//        Swd_Bus_Reset();
//
//        Swd_Bus_SendByte( 0x9E );
//        Swd_Bus_SendByte( 0xE7 );
//        Swd_Bus_SendByte( 0x00 );
//        Swd_Bus_SendByte( 0x00 );
//
Swd_Bus_Reset();
Swd_Bus_SendByte( 0x00 );
椰油酸
//--------------------------------------------------
//Read DP.IDR
Swd_Bus_SendByte( 0xa5 );
Swd_Bus_Turn();
tmp8 = Swd_Bus_RecvAck();
tmp32 = Swd_Bus_RecvWordAndParity();
Swd_Bus_Turn();
Swd_Bus_SendByte( 0x00 );
//--------------------------------------------------
/
制作音箱/write ctrl/state
Swd_Bus_SendByte( 0xa9 );
Swd_Bus_Turn();
tmp8 = Swd_Bus_RecvAck();
Swd_Bus_Turn();
Swd_Bus_SendWordAndParity( 0x50000000 );
Swd_Bus_SendByte( 0x00 );
//--------------------------------------------------
//Read AP.IDR
Swd_Bus_SendByte( 0xb1 );  //write select AP BANK - 0F        Swd_Bus_Turn();
tmp8 = Swd_Bus_RecvAck();
Swd_Bus_Turn();
Swd_Bus_SendWordAndParity( 0x000000f0 );
Swd_Bus_SendByte( 0x00 );
Swd_Bus_SendByte( 0x9f );  //read DRW dummy
Swd_Bus_Turn();
tmp8  = Swd_Bus_RecvAck();
tmp32 = Swd_Bus_RecvWordAndParity();
Swd_Bus_Turn();
Swd_Bus_SendByte( 0x00 );
Swd_Bus_SendByte( 0xbd );  //read rdbuf
Swd_Bus_Turn();
tmp8  = Swd_Bus_RecvAck();
tmp32 = Swd_Bus_RecvWordAndParity();
Swd_Bus_Turn();
Swd_Bus_SendByte( 0x00 );
//--------------------------------------------------
//SET AP 位宽为32位
Swd_Bus_SendByte( 0xb1 );  //write select AP BANK - 00
Swd_Bus_Turn();
tmp8 = Swd_Bus_RecvAck();
Swd_Bus_Turn();
Swd_Bus_SendWordAndParity( 0x00000000 );
Swd_Bus_SendByte( 0x00 );
Swd_Bus_SendByte( 0xA3 );  //write CSW -
Swd_Bus_Turn();
tmp8 = Swd_Bus_RecvAck();
Swd_Bus_Turn();
Swd_Bus_SendWordAndParity( 0x23000002 );  //32bit 位宽,地址不⾃动增加        Swd_Bus_SendByte( 0x00 );
//--------------------------------------------------
//stop the cpu
Swd_Bus_SendByte( 0x8B );  //write TAR
Swd_Bus_Turn();
tmp8 = Swd_Bus_RecvAck();
Swd_Bus_Turn();
Swd_Bus_SendWordAndParity( 0xE000EDF0 );  //
Swd_Bus_SendByte( 0x00 );
Swd_Bus_SendByte( 0xBB );  //WRITE DRW
Swd_Bus_Turn();
tmp8 = Swd_Bus_RecvAck();
Swd_Bus_Turn();
Swd_Bus_SendWordAndParity( 0xA05F0303 );
Swd_Bus_SendByte( 0x00 );
//--------------------------------------------------
//Read User Memery  @ 0x00100d90
Swd_Bus_SendByte( 0x8B );  //write TAR
Swd_Bus_Turn();
tmp8 = Swd_Bus_RecvAck();
Swd_Bus_Turn();
Swd_Bus_SendWordAndParity( 0x00100d90 );
Swd_Bus_SendByte( 0x00 );
Swd_Bus_SendByte( 0x9f );  //read DRW
Swd_Bus_Turn();
tmp8  = Swd_Bus_RecvAck();
tmp32 = Swd_Bus_RecvWordAndParity();  //dummy        Swd_Bus_Turn();
Swd_Bus_SendByte( 0x00 );
Swd_Bus_SendByte( 0xbd );  //read rdbuf北斗导航认证启动
Swd_Bus_Turn();
tmp8  = Swd_Bus_RecvAck();
tmp32 = Swd_Bus_RecvWordAndParity();  //read
Swd_Bus_Turn();
雨棚制作
Swd_Bus_SendByte( 0x00 );
//--------------------------------B的立体图
//write and read reg  @ 0x40020F04
Swd_Bus_SendByte( 0x8B );  //write TAR
Swd_Bus_Turn();
tmp8 = Swd_Bus_RecvAck();
Swd_Bus_Turn();
Swd_Bus_SendWordAndParity( 0x40020F04 );          Swd_Bus_SendByte( 0x00 );
Swd_Bus_SendByte( 0xBB );  //WRITE DRW
Swd_Bus_Turn();
tmp8 = Swd_Bus_RecvAck();
Swd_Bus_Turn();
sero-0151Swd_Bus_SendWordAndParity( 0xffffffff );
Swd_Bus_SendByte( 0x00 );
Swd_Bus_SendByte( 0x9f );  //read DRW dummy        Swd_Bus_Turn();
tmp8  = Swd_Bus_RecvAck();
tmp32 = Swd_Bus_RecvWordAndParity();
Swd_Bus_Turn();
Swd_Bus_SendByte( 0x00 );
Swd_Bus_SendByte( 0xbd );    //read rdbuf
Swd_Bus_Turn();
tmp8  = Swd_Bus_RecvAck();
tmp32 = Swd_Bus_RecvWordAndParity();
Swd_Bus_Turn();
Swd_Bus_SendByte( 0x00 );
while( 1 );

本文发布于:2024-09-22 09:54:27,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/99171.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:ASCII码表
标签:实现   协议   地址   出来   制作
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议