新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > GNU ARM匯編--(九)s3c2440的PWM

GNU ARM匯編--(九)s3c2440的PWM

作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
  • //movr2,r0
  • ldrr1,=TCNTB0
  • //ldrr2,=200
  • strr0,[r1]
  • movr0,r0,LSR#2
  • ldrr1,=TCMPB0
  • //ldrr2,=50
  • strr0,[r1]
  • ldrr1,=TCON
  • ldrr2,=(DZ_eable<<4)|(auto_reload<<3)|(inverter<<2)|(man_update<<1)|(start<<0)
  • strr2,[r1]
  • ldrr1,=TCON
  • ldrr2,=(DZ_eable<<4)|(auto_reload<<3)|(inverter<<2)|(clear_man_update<<1)|(start<<0)
  • strr2,[r1]
  • ldrr2,=GPBDAT
  • ldrr1,=0x1a0
  • strr1,[r2]
  • movpc,lr
  • main:
  • ldrr1,=TCON
  • ldrr2,=(DZ_eable<<4)|(auto_reload<<3)|(inverter<<2)|(man_update<<1)|(stop<<0)
  • strr2,[r1]
  • ldrlr,=loop
  • ldrpc,_pwm_uart_test
  • _pwm_uart_test:.wordpwm_uart_test
  • loop:
  • bloop@死循環(huán)
  • undefined_instruction:
  • nop
  • software_interrupt:
  • nop
  • prefetch_abort:
  • nop
  • data_abort:
  • nop
  • not_used:
  • nop
  • fiq:
  • nop
  • pwm_uart_test.c內(nèi)容如下:
    [cpp]view plaincopy
    1. #include"pwm_uart_test.h"
    2. externvoidBuzzer_Freq_Set(intfreq);
    3. //externvoidBuzzer_Freq_Set(void);
    4. charuart_GetByte(void)
    5. {
    6. while(!(rUTRSTAT0&0x1));//WaituntilTHRisempty.
    7. returnRdURXH0();
    8. }
    9. voiduart_GetString(char*pt)
    10. {
    11. while(*pt)
    12. uart_GetByte();
    13. }
    14. voiduart_SendByte(intdata)
    15. {
    16. if(data==)
    17. {
    18. while(!(rUTRSTAT0&0x2));
    19. WrUTXH0();
    20. }
    21. while(!(rUTRSTAT0&0x2));//WaituntilTHRisempty.
    22. WrUTXH0(data);
    23. }
    24. //====================================================================
    25. voiduart_SendString(char*pt)
    26. {
    27. while(*pt)
    28. uart_SendByte(*pt++);
    29. }
    30. voiduart_test(void)
    31. {
    32. charstr[20]="helloworld";
    33. inta=97;
    34. //while(1)
    35. //uart_SendByte(a);
    36. uart_SendString(str);
    37. chars=uart_GetByte();
    38. //if(s==a)
    39. if(s==97)
    40. rGPBDAT=0x1c0;
    41. //uart_SendByte(a);
    42. //uart_SendByte(97);
    43. //uart_SendByte(a);
    44. uart_SendByte((int)s);
    45. uart_SendByte((int)s);
    46. }
    47. voidpwm_uart_test(void)
    48. {
    49. intfreq=10;
    50. Buzzer_Freq_Set(freq);
    51. //Buzzer_Freq_Set();
    52. uart_SendString("start");
    53. /*
    54. inti;
    55. for(i=0;i<1000;i++)
    56. uart_SendString("wait");
    57. while(1)
    58. {
    59. charkey=uart_GetByte();
    60. uart_SendByte(key);
    61. if(key==a||key==A)
    62. {
    63. if(freq<2000)//lci20000
    64. freq+=10;
    65. uart_SendByte(a);
    66. Buzzer_Freq_Set(freq);
    67. }
    68. if(key==b||key==B)
    69. {
    70. if(freq>11)
    71. freq-=10;
    72. uart_SendByte(b);
    73. Buzzer_Freq_Set(freq);
    74. }
    75. //uart_SendString(" Freq=%d",freq);
    76. //if(key==ESC_KEY)
    77. //{
    78. //Buzzer_Stop();
    79. //return;
    80. //}
    81. }
    82. */
    83. }

    在這個(gè)例子中,既有匯編調(diào)用c,也有c調(diào)用匯編.可供以后參考.目前,串口輸入還有些問題,還得繼續(xù)調(diào)一下.串口遇到一個(gè)想不明白的問題,單單串口是正常的,但在打開PWM定時(shí)器后,串口就出問題了,打印只能出前面幾個(gè)字符,這是個(gè)神馬情況,有人知道的請(qǐng)幫我下,thks!
    從代碼中有這樣的設(shè)定:
    定時(shí)器的輸入時(shí)鐘為@定時(shí)器輸入時(shí)鐘周期 = PCLK/(prescaler + 1)/(divider value)
    @clk = 100M/(249+1)/8=25k
    TCNTB0設(shè)為200,而TCMPB0為50,則TOUT0輸出占空比為25%的方波,方波的周期為200/clk=8ms
    如果有示波器,倒可以驗(yàn)證一下這個(gè)結(jié)果.如果有對(duì)朋友覺得這個(gè)方波估計(jì)的不對(duì),歡迎指出,謝謝!

    上一頁 1 2 3 下一頁

    關(guān)鍵詞: ARM匯編s3c2440PW

    評(píng)論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉