新闻中心

EEPW首页>嵌入式系统>设计应用> GNU ARM汇编--(九)s3c2440的PWM

GNU ARM汇编--(九)s3c2440的PWM

作者: 时间:2016-11-26 来源:网络 收藏
  • //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@死循环
  • undefined_instruction:
  • nop
  • software_interrupt:
  • nop
  • prefetch_abort:
  • nop
  • data_abort:
  • nop
  • not_used:
  • nop
  • fiq:
  • nop
  • pwm_uart_test.c内容如下:
    [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. }

    在这个例子中,既有汇编调用c,也有c调用汇编.可供以后参考.目前,串口输入还有些问题,还得继续调一下.串口遇到一个想不明白的问题,单单串口是正常的,但在打开PWM定时器后,串口就出问题了,打印只能出前面几个字符,这是个神马情况,有人知道的请帮我下,thks!
    从代码中有这样的设定:
    定时器的输入时钟为@定时器输入时钟周期 = PCLK/(prescaler + 1)/(divider value)
    @clk = 100M/(249+1)/8=25k
    TCNTB0设为200,而TCMPB0为50,则TOUT0输出占空比为25%的方波,方波的周期为200/clk=8ms
    如果有示波器,倒可以验证一下这个结果.如果有对朋友觉得这个方波估计的不对,欢迎指出,谢谢!

    上一页 1 2 3 下一页

    关键词:ARM汇编s3c2440PW

    评论


    相关推荐

    技术专区

    关闭