音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

改動(dòng)《深入淺出ARM7—LPC213X/214X(上)》第163頁的程序4.11?

作者:上善若水 欄目:ARM技術(shù)
改動(dòng)《深入淺出ARM7—LPC213X/214X(上)》第163頁的程序4.11?
改動(dòng)《深入淺出ARM7—LPC213X/214X(上)》第163頁的程序4.11,我想使FIFO的觸發(fā)點(diǎn)設(shè)置為4個(gè)字節(jié),其它與原程序相同,我只修改了紅色的部分。完整程序如下:
#include "config.h"
/* 定義串口模式設(shè)置數(shù)據(jù)結(jié)構(gòu) */
typedef struct UartMode
{
  uint8 datab;   // 字長度,5/6/7/8可選
  uint8 stopb;   // 停止位,1/2可選
  uint8 parity;     // 奇偶校驗(yàn)位,0-無校驗(yàn),1-奇校驗(yàn),2-偶校驗(yàn)
}UARTMODE;
uint8 rcv_buf[4];     // UART0數(shù)據(jù)接收緩沖區(qū)
volatile uint8 rcv_new;  // 接收新數(shù)據(jù)標(biāo)志
***********************************************************************
函數(shù)名稱 :IRQ_UART0()
函數(shù)功能 :串口0接收中斷服務(wù)程序
***********************************************************************
void __irq IRQ_UART0 (void)
{
  uint8 i;
  
  if ((U0IIR & 0x0F) == 0x04)
    rcv_new = 1;      // 設(shè)置接收到新的數(shù)據(jù)標(biāo)志
  for (i=0; i<4; i++)
  {
    rcv_buf[i] = U0RBR;    // 讀取FIFO的數(shù)據(jù),并清除中斷  
  }
  VICVectAddr = 0x00;      // 中斷處理結(jié)束
}
**************************************************************************
** 函數(shù)名稱 :UART0_SendByte()
** 函數(shù)功能 :向串口0發(fā)送1字節(jié)數(shù)據(jù)
** 入口參數(shù) :dat 要發(fā)送的數(shù)據(jù)
** 出口參數(shù) :無
***********************************************************************void UART0_SendByte (uint8 dat)
{
  U0THR = dat; // 要發(fā)送的數(shù)據(jù)
}
************************************************************************* 函數(shù)名稱 :UART0_SendBuf()
** 函數(shù)功能 :向串口發(fā)送8字節(jié)數(shù)據(jù)
** 入口參數(shù) :dat 要發(fā)送的數(shù)據(jù)
** 出口參數(shù) :無
***********************************************************************
void UART0_SendBuf (void)
{
  uint8 i;
  
  for (i=0; i<4; i++)
    UART0_SendByte(rcv_buf[i]);
  while ((U0LSR & 0x20) == 0);   // 等待數(shù)據(jù)發(fā)送完畢
}
**************************************************************************
** 函數(shù)名稱 :UART0_Init()
** 函數(shù)功能 :串口初始化,設(shè)置工作模式和波特率。
***********************************************************************
int8 UART0_Init (uint32 baud, UARTMODE set)
{
  
}
************************************************************************* 函數(shù)名稱 :main()
***********************************************************************
int main (void)
{
  UARTMODE set;

  set.datab  = 8;
  set.stopb  = 1;
  set.parity = 0;
  
  rcv_new = 0;
  
  PINSEL0 = 0x00000005;          // 設(shè)置I/O連接到UART0
  
  UART0_Init(115200, set);       // 串口初始化
U0FCR = 0x41;               // 使能FIFO,并設(shè)置觸發(fā)點(diǎn)為8字節(jié)
  U0IER = 0x01;               // 允許RBR中斷,即接收中斷
  
  IRQEnable();             // 使能IRQ中斷
  /* 使能UART0中斷 */
  VICIntSelect = 0x00000000;       // 設(shè)置所有的通道為IRQ中斷
  VICVectCntl0 = 0x20 | 0x06;      // UART0分配到IRQ slot0,即最高優(yōu)先級
  VICVectAddr0 = (uint32)IRQ_UART0;   // 設(shè)置UART0向量地址
  VICIntEnable = 1 << 0x06;      // 使能UART0中斷

  while (1)
  {
    if (rcv_new == 1)
    {  
       rcv_new =0;
       UART0_SendBuf();
    }
  }
    return 0;
}
我只是修改了U0FCR = 0x41;還有取FIFO和發(fā)送子程序中的計(jì)數(shù)i=4,為什么運(yùn)行的結(jié)果是無論發(fā)多少數(shù),都一次性全收到,然后有幾個(gè)不可打印字符跟在后面,接著再發(fā)數(shù),就沒有任何響應(yīng)了?

* - 本貼最后修改時(shí)間:2005-12-23 21:10:00 修改者:上善若水

2樓: >>參與討論
zlgarm
re
按照你的修改,我試了試 ,程序運(yùn)行正常.
1.首先你要注意串口有三種方式的中斷,設(shè)置U0IER = 0x01時(shí),CTI和RDA都可以導(dǎo)致進(jìn)入中斷服務(wù)程序.
2.對于RDA中斷,你設(shè)置的是4字節(jié)觸發(fā),那么當(dāng)只有當(dāng)串口FIFO中連續(xù)接收到四個(gè)字節(jié)或其整數(shù)倍的情況下才可以產(chǎn)生RDA中斷,即在以上程序中rcv_new標(biāo)志才能置1,這樣程序才調(diào)用串口發(fā)送程序UART0_SendBuf(),這樣上位機(jī)的串口軟件才能收到相應(yīng)的數(shù)據(jù)。(建議用上位機(jī)用字符串發(fā)送方式向串口發(fā)送數(shù)據(jù),以保證接收FIFO數(shù)據(jù)增加到觸發(fā)點(diǎn))
3.如果你發(fā)送小于觸發(fā)點(diǎn)的字符串,那么是不會觸發(fā)RDA中斷,即不會產(chǎn)生RDA中斷標(biāo)志,這樣rcv_new標(biāo)志就不會置1。所以就不會向串口上位機(jī)軟件發(fā)送數(shù)據(jù)了。
請你注意書上的相關(guān)介紹。

3樓: >>參與討論
上善若水
再問陳老師
我把這個(gè)程序又調(diào)試了兩遍,一次用jtag下載,一次用isp下載,運(yùn)行的結(jié)果都是送數(shù)后毫無反應(yīng)。我嘗試了多款串口調(diào)試軟件,都是以字符串格式發(fā)送數(shù)據(jù)。請問陳老師,還有哪里會出現(xiàn)致命的問題?

4樓: >>參與討論
zgpswh
我試過這樣的程序
用4個(gè)字節(jié)作觸發(fā)點(diǎn),程序是沒有問題的,關(guān)鍵是當(dāng)你發(fā)三個(gè)字節(jié)或不是4的整數(shù)倍字節(jié)時(shí)會沒有反應(yīng),下次無論你發(fā)什么數(shù)據(jù),都不會觸發(fā)引起中斷了,你只有重起程序。這會不會是一個(gè)BUG呢?

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
請問周公:為什么游些程序能燒進(jìn)去有些不能?
求助 沉思,zlgARM:中斷的困惑
請問周公,《深入淺出ARM7LPC213x/LPC214x下冊》有出版嗎
今天買了easyARM 2131 ~!
二改《深入淺出ARM7—LPC213X/214X(上)》第163頁的程序4.11?
免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號